Content-Type: multipart/related; start=; boundary=----------LkJeSl8GS9sfggkpwGdDkc Content-Location: http://www.cpu-world.com/Arch/6809.html Subject: =?utf-8?Q?Motorola=206809=20microprocessor=20architecture?= MIME-Version: 1.0 ------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline; filename=6809.html Content-Type: text/html; charset=iso-8859-1; name=6809.html Content-ID: Content-Location: http://www.cpu-world.com/Arch/6809.html Content-Transfer-Encoding: 8bit Motorola 6809 microprocessor architecture

Motorola 6809 microprocessor architecture

Memory

Program, data and stack memories occupy the same memory space. The total addressable memory size is 64 KB.

Program memory - program can be located anywhere in memory. Jump, subroutine calls and conditional branches instructions can be used to jump anywhere in memory.

Data memory - data can be anywhere in memory space.

Stack memory - user and system stacks can be placed anywhere in memory space. Stacks grow downwards.

Reserved memory locations:

  • FFF0h - FFF1h: reserved for future use.
  • FFF2h - FFF3h: Pointer to SWI3 interrupt-processing routine.
  • FFF4h - FFF5h: Pointer to SWI2 interrupt-processing routine.
  • FFF6h - FFF7h: Pointer to FIRQ interrupt-processing routine.
  • FFF8h - FFF9h: Pointer to IRQ interrupt-processing routine.
  • FFFAh - FFFBh: Pointer to SWI interrupt-processing routine.
  • FFFCh - FFFDh: Pointer to NMI interrupt-processing routine.
  • FFFEh - FFFFh: Pointer to RESET handling code.
  • Because the processor doesn't have hardware I/O capability some memory addresses may be reserved for memory mapped I/O.

Interrupts

IRQ - maskable interrupt. When the interrupt occurs the CPU sets E condition flag, pushes program counter, index registers, accumulators and condition code register into the stack, disables further IRQ interrupts by setting I condition flag, and jumps to memory location, address of which is stored in memory FFF8h - FFF9h. To return from the interrupt the processing routine should use RTI instruction. This interrupt can be enabled/disabled by setting/clearing I condition flag.

FIRQ - fast maskable interrupt. When the interrupt occurs the CPU clears E condition flag, pushes program counter and condition code register into the system stack, disables further fast and normal interrupts by setting I and F condition flags, and jumps to memory location, address of which is stored in memory FFF6h - FFF7h. To return from the interrupt the processing routine should use RTI instruction. This interrupt can be enabled/disabled by setting/clearing F condition flag. FIRQ interrupt has higher priority than IRQ.

NMI - non-maskable interrupt. When the interrupt occurs the CPU clears E condition flag, pushes program counter, index registers, accumulators and condition code register into the system stack, disables further maskable interrupts by setting F and I condition flags, and jumps to memory location, address of which is stored in memory FFFCh - FFFDh. To return from the interrupt the processing routine should use RTI instruction. NMI interrupt has higher priority than IRQ and FIRQ interrupts. This interrupt can not be disabled.

SWI - software interrupt. This interrupt can be only invoked from the program. When the interrupt is invoked the CPU sets E condition flag, pushes program counter, index registers, accumulators and condition code register into the system stack, disables maskable interrupts by setting F and I condition flags, and jumps to memory location, address of which is stored in memory FFFAh - FFFBh. To return from the interrupt the processing routine should use RTI instruction.

SWI2 - software interrupt 2. This interrupt can be only invoked from the program. When the interrupt is invoked the CPU sets E condition flag, pushes program counter, index registers, accumulators and condition code register into the system stack, and jumps to memory location, address of which is stored in memory FFF4h - FFF5h. To return from the interrupt the processing routine should use RTI instruction.

SWI3 - software interrupt 3. This interrupt works almost like SWI2 with the only exception that the address of SWI3 interrupt processing routine is located at FFF2h - FFF3h.

I/O ports

None.

Registers

Accumulator A (A) is an 8-bit register used for arithmetic and logical operations.

Accumulator B (A) is an 8-bit register used for arithmetic and logical operations. Most instructions that work with the accumulator A can be used with the accumulator B. The only exceptions are instructions DAA (works with the accumulator A only) and ABX (works with the accumulator B only).

Accumulators A and B can be combined together into 16-bit accumulator D. The register A contains the most significant byte of the accumulator D, and the register B contains the least significant byte.

Index registers X and Y are a 16-bit registers that usually contain an index used for indexed addressing modes.

Program counter (PC) is a 16-bit register pointing to the next instruction that will be executed by the CPU. PC register can be used with some indexed addressing modes.

System stack pointer (S) is a 16-bit register pointing to the top of system stack. The system stack stores machine state during subroutine calls and interrupts.

User stack pointer (U) is a 16-bit register pointing to the top of user stack. The user stack is usually used to pass arguments to/from subroutines, and it can also be used for temporary data storage.

When data is pushed into the system or user stack, a stack register is decremented by 2 and then data is stored into memory location referenced by the stack pointer.

Both S and U stack registers can be used as index registers.

Direct Page register contains the most significant byte of the zero page address. After CPU reset this register is set to value 00h.

Condition code register contains the following flags:

  • Entire flag (E, bit 7) - set if the complete machine state was saved in the stack. If this bit is not set then only program counter and condition code registers were saved in the stack. This bit is used by interrupt handling routines only. The bit is cleared by fast interrupts, and set by all other interrupts.
  • Fast interrupt mask (F, bit 6) - set if the FIRQ interrupt is disabled.
  • Half carry (H, bit 5) - set if there was a carry from bit 3 to bit 4 of the result during the last add operation.
  • Interrupt mask (I, bit 4) - set if the IRQ interrupt is disabled.
  • Negative (N, bit 3) - set if the most significant bit of the result is set. This bit can be set not only by arithmetic and logical operations, but also by load/store operations.
  • Zero (Z, bit 2) - set if the result is zero. Like the N bit, this bit can be set not only by arithmetic and logical operations, but also by load/store operations.
  • Overflow (V, bit 1) - set if there was an overflow during last result calculation. Logical, load and store operations clear this bit.
  • Carry (C, bit 0) - set if there was a carry from the bit 7 during last add operation, or if there was a borrow from last subtract operation, or if bit 7 of the A register was set during last MUL operation.

Instruction Set

6800 instruction set consists of 59 instructions:

  • Data moving instructions - load, store, clear and exchange.
  • Arithmetic - add, subtract, negate, increment, decrement, compare, test and multiply.
  • Logic - AND, OR, exclusive OR, complement and shift/rotate.
  • Control transfer - call and return from subroutine, jumps and conditional and unconditional branches.
  • Other - bit test, stack operations, software interrupts, etc.

Addressing modes

Inherent - the data value/data address is implicitly associated with the instruction.

Immediate - 8-bit or 16-bit data is provided in the instruction.

Register - references the data in a register or in a register pair.

Direct - one-byte operand provided in the instruction specifies the memory address in page zero where data is located. Page zero after processor reset always points to 0000h. Zero page address can be changed to any 256-bit page boundary by setting Direct Page register to the high order byte of the page address. For example, to move zero page to memory 8100h the Direct Page register should be set to 81h.

Extended - two-byte operand provided in the instruction specifies memory location where data is stored.

Extended Indirect - two-byte operand provided in the instruction specifies memory location where data address is stored.

Relative - one- or two-byte offset is added to the program counter. The resulting value is a memory address containing data or memory address where the CPU transfers control.

Relative Indirect - one- or two-byte offset is added to the program counter. The resulting value is a memory address where data address is stored.

Indexed - the contents of one of index or pointer registers is added to fixed offset value / content of accumulator register. The resulting value is a memory address where data resides. For indirect indexed modes the calculated address points to memory where data address is stored. The processor supports the following indexed addressing modes:

  • Zero-offset Indexed - the contents of index or pointer register contains memory location where data resides.
  • Zero-offset Indexed Indirect - the contents of index or pointer register contains memory location where data address resides.
  • Constant-offset Indexed - the contents of index or pointer register is added to 5-bit, 8-bit or 16-bit offset value. The resulting value is a memory address where data resides.
  • Constant-offset Indexed Indirect - the contents of index or pointer register is added to 5-bit, 8-bit or 16-bit offset value. The resulting value is a memory address where data address resides.
  • Accumulator-offset Indexed - the contents of index or pointer register is added to the contents of accumulator A or B. The resulting value is a memory address where data resides.
  • Accumulator-offset Indexed Indirect - the contents of index or pointer register is added to the contents of accumulator A or B. The resulting value is a memory address where data address resides.
  • Auto-Increment Indexed - the contents of index or pointer register contains memory location where data resides. After the CPU reads/updates the data the content of index or pointer register is incremented by 1 or 2.
  • Auto-Increment Indexed Indirect - the contents of index or pointer register contains memory location where data address is stored. After the CPU reads the data address and accesses/updates the data, the content of index or pointer register is incremented by 1 or 2.
  • Auto-Decrement Indexed - the content of index or pointer register is decremented by 1 or 2. The resulting register value is memory location where data resides.
  • Auto-Decrement Indexed Indirect - the content of index or pointer register is decremented by 1 or 2. The resulting register value is memory location where data address is stored.
Last modified: 9 May 2011
Terms and Conditions · Privacy Policy · Contact Us (c) Copyright 2003 - 2010 Gennadiy Shvets

Search CPU-World

Search site contents:

Identify part

Identify CPU, FPU or MCU:

Quick Links

Jump to CPU / Family

Type in partial CPU manufacturer, family, model and/or number.

------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline Content-Type: image/gif Content-Location: http://cdn.cpu-world.com/Images/middle-dotted.gif Content-Transfer-Encoding: Base64 R0lGODlhAgASAIABAAAAAP///yH5BAEAAAEALAAAAAACABIAAAIGjI8ZoK0FADs= ------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline; filename=cpu_world2.css Content-Type: text/css; charset=iso-8859-1; name=cpu_world2.css Content-Location: http://cdn.cpu-world.com/cpu_world2.css Content-Transfer-Encoding: 8bit body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;} table{border-collapse:collapse;border-spacing:0;} fieldset,img{border:0;} address,caption,cite,code,dfn,em,th,var{font-weight:normal;} ol,ul {list-style:none;} caption,th {text-align:left;} h1,h2,h3,h4,h5,h6{font-size:100%;} body { background-color: #FFFFFF; text-align: center; padding: 8px; } p { margin: 8px 0px 0 0px; } h1 { color: #404040; font-family: verdana, helvetica, arial, sans-serif; font-size: 13px; font-weight: bold; /*margin-top: 8px;*/ margin-bottom: 0; } h2 { font-family: verdana, helvetica, arial, sans-serif; font-size: 13px; margin-top: 8px; margin-bottom: 0; } h3 { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; margin-top: 8px; margin-bottom: 0; } h3.h3_first { margin-top: 0 !important; } ul { padding-left: 25px; list-style-type: square; } .shdw { padding: 1px; background-color: #EEEEEE; border: 1px solid #F8F8F8; margin-bottom: 4px; _width: 100%; } .shdw2 { padding: 1px; background-color: #D0D0D0; border: 1px solid #E2E2E2; _width: 100%; } .more { height: 14px; text-align: right; background: url(/Images/test-gyr.jpg) repeat-y right; font-size: 10px; padding-top: 0px; padding-right: 8px; } input, select, textarea { font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; color: #404040; font-weight: bold; padding: 1px; background-color: #FFFFFF; /*border-left: 1px solid #B4B0A8; border-top: 1px solid #B4B0A8; border-right: 1px solid #F4F0D8; border-bottom: 1px solid #F4F0D8;*/ border-left: 1px solid #A0A0A0; border-top: 1px solid #A0A0A0; border-right: 1px solid #E8E8E8; border-bottom: 1px solid #E8E8E8; } textarea { font-weight: normal; font-size: 12px; } .input, .CW_cpudata { font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; } .itext { font-size: 13px; padding: 1px; } .ibutton, .ibuttonr, .ef_button, .comment_rbutton { background-color: #D4D0C8; /*background: url(/Images/test-ggd.jpg) no-repeat right bottom;*/ color: #404040; font-size: 11px; font-weight: bold; padding: 1px; border-left: 1px solid #E4E0D8; border-top: 1px solid #E4E0D8; border-right: 1px solid #A4A098; border-bottom: 1px solid #A4A098; cursor: pointer; } .ibuttonr, .ef_buttonr { margin-left: 5px; } input[disabled].ibutton, input[disabled].ibuttonr { color: #808080; } .inputr { width: 160px; margin-top: 3px; } .smaller { font-family: verdana, helvetica, arial, sans-serif; font-size: 11px } .even_smaller { font-family: verdana, helvetica, arial, sans-serif; font-size: 10px } .very_small { font-family: verdana, helvetica, arial, sans-serif; font-size: 9px } .news_date { background-color: #E0E0E0; color: #404040; font-weight: bold; padding: 1px 2px 1px 2px } .news_title { font-weight: bold; color: #808080; border-top: 1px solid #E0E0E0; border-bottom: 1px solid #E0E0E0; } .news_text { padding: 5px 10px 15px 10px; line-height: 130%; } .news_updated { float: right; width: 100px; padding: 1px; font-size: 85%; text-align: center; font-weight: normal; background-color: #E0E0E0; color: #000000; } .news_full { font-size: 90%; white-space: nowrap; } .row1 { background-color: #FFFFFF; } .row2 { background-color: #E8E8E8; } .row1s { background-color: #FFF0C0; } .row2s { background-color: #FFE0A0; } .pad3 { padding: 3px; } .div1 { background-color: #FFFFFF; padding: 1px 0 1px 0; } .div2 { background-color: #F0F0F0; padding: 1px 0 1px 0; } .div_i { padding: 2px 0 2px 0; } table.v_top td { vertical-align: top; } table.cellspacing10 { border-collapse: separate; border-spacing: 10px; } table.center_td td { text-align: center; } table.nav_table { font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; background-color: #FFFFFF; width: 762px; border-spacing: 0; /*border-top: 3px solid #FFFFFF; border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0; border-bottom: 1px solid #C0C0C0;*/ border: 1px solid #C0C0C0; padding: 0; width: 100%; } table.nav_table th { background-color: #404040; color: #FFFFFF; padding: 0; background-image: none; height: 20px; } table.nav_table td { background-color: #FFFFFF; color: #404040; } th.h_mmenu { padding-left: 20px !important; text-align: left; border-left: 1px solid #FFFFFF; } td.h_smenu { padding-left: 20px; text-align: left; border-left: 1px solid #404040; } input.h_itext { font-size: 11px; font-weight: bold; padding: 1px; color: #404040; width: 130px } input.h_ibutton { font-size: 11px; border: 1px; font-weight: bold; padding: 1px 0 1px 0; cursor: pointer; width: 22px } input.h_ibutton60 { font-size: 11px; border: 1px; font-weight: bold; padding: 1px 0 1px 0; cursor: pointer; width: 60px } input.h_iradio { padding: 0; vertical-align: bottom; width: 12px; height: 12px } select.h_iselect { font-size: 11px; font-weight: bold; padding: 1px; color: #404040; width: 130px } .main_content { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; border: 1px solid #C0C0C0; padding: 3px; background-color: #FFFFFF; } .cpu_content, .news_content, .info_content { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; border: 1px solid #C0C0C0; padding: 0; background-color: #FFFFFF; } .news_content, .info_content { line-height: 130%; } .news_content p, .info_content p, .info_content ul { margin-top: 10px; } .info_content p { padding: 0 10px 0 10px; } .info_content blockquote { margin: 10px 10px 0 10px; padding: 3px; background-color: #E0E0E0; border-left: 5px solid #C0C0C0; } .info_content code { margin: 10px 10px 0 30px; } .info_content h2, .info_content h3 { margin-top: 15px; } cite { display: block; padding: 5px 10px 5px 20px; text-decoration: none; font-style: normal; } .side_fbox { font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; background-color: #FFFFFF; /*border: 0;*/ border-width: 0 1px 1px 1px; border-color: #C0C0C0; border-style: solid; padding: 8px 5px 8px 5px; margin: 0; } .side_h4, .side_h4a { font-family: verdana, helvetica, arial, sans-serif; font-size: 10px; font-weight: normal; text-transform: uppercase; text-align: center; background-color: #F0F0F0; border-top: 1px solid #C0C0C0; border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0; border-bottom: 1px solid #D0D0D0; padding: 2px; margin: 0; } .side_h4a { border-top: 0; } .side_ad { text-align: center; padding-top: 10px; } .yhb { border-top: 3px solid #FFFFFF; font-family: arial, sans-serif, helvetica, verdana; font-size: 12px; background-color: #FFD060; color: #000000; font-weight: bold; padding: 1px 0 1px 0; text-align: center; } table.ft_table { width: 100%; border-spacing: 0; border: 1px solid #C0C0C0; } table.ft_table td { background-color: #404040; } table.ft_table th { background-color: #FFFFFF; } table.ft_table td { font-family: verdana, helvetica, arial, sans-serif; font-size: 10px; color: #FFFFFF; padding: 1px 5px 1px 5px; } table.ft_table td a:link, table.ft_table td a:active, table.ft_table td a:visited { color: #E0B060; } table.ft_table td a:hover { color: #FFD060; } table.container_table { padding: 0 0 0 0; margin: 0 0 0 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.container_table td { padding: 0 0 0 0; margin: 0 0 0 0; } table.comments_table { border: 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.comments_table th { border-width: 1px 0 0 0; border-style: dotted; border-color: #404040; background-color: #FFFFFF; color: #000000; font-weight: bold; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 3px 1px 3px; text-align: left; } table.comments_table td { background-color: #FFFFFF; color: #000000; font-weight: bold; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 3px 1px 3px; text-align: left; } .comments { /*border-top: 1px dotted #404040;*/ padding: 0; clear: both; /*margin: 0 0 5px 0;*/ text-align: left; } .comments h3 { margin-top: 0; background-color: #C0C0C0; padding: 2px 3px 2px 3px; border-bottom: 1px solid #A0A0A0; } .comments p { margin-bottom: 0; padding-bottom: 10px; } .comments_author { background-color: #E0E0E0; padding: 2px 3px 2px 3px; text-align: left; } .comment_buttons { text-align: right; padding-top: 12px; padding-bottom: 0; } .comment_buttons2 { margin-top: 3px; padding-top: 3px; text-align: right; border-top: 1px dotted #C0C0C0; } .comment_right { float: right; text-align: right; width: 200px; } .comment_right a { font-weight: bold; } .comment_response { padding-top: 8px; } .comment_reply { margin: 3px; padding: 0 10px 10px 10px; border: 1px solid #C0C0C0; } .comment_g1, .comment_g2 { padding-left: 20px; } .comment_g2 { border-left: 1px dashed #C0C0C0; } .comment_l2 { border-left: 1px dashed #C0C0C0; padding-left: 2px; } .comment_l0 { clear: both; margin-bottom: 3px; } .comment_hreply { float: right; width: 60px; padding-left: 2px; background-color: #FFFFFF; } .comment_rbutton { font-size: 90%; width: 58px; } table.bhb_table { border: solid 1px #000000; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.bhb_table th { background-color: #404040; color: #FFFFFF; font-weight: normal; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 0 1px 0; text-align: center; } table.bhb_table th h2 { font-family: arial, sans-serif, helvetica, verdana; font-size: 12px; font-weight: normal; } table.bhb_table td { background-color: #FFFFFF; padding: 8px 3px 8px 3px; } table.links_table { /*border: 1px solid #000000;*/ font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; padding: 1px 2px 1px 5px; border-left: 1px solid #C0C0C0; margin-left: 5px; } table.links_table th { background-color: #808080; color: #FFFFFF; font-weight: normal; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 0 1px 0; text-align: center; } table.links_table td { background-color: #FFFFFF; padding: 8px 3px 8px 3px; } table.linkst_table { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.linkst_table th { background-color: #808080; color: #FFFFFF; font-weight: normal; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 0 1px 0; text-align: center; } table.linkst_table td { background-color: #FFFFFF; padding: 8px 3px 8px 3px; } table.bh_table { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.bh_table th { background-color: #404040; color: #FFFFFF; font-weight: normal; font-family: arial, sans-serif, helvetica, verdana; padding: 1px 0 1px 0; text-align: center; } table.bh_table th h2 { font-family: arial, sans-serif, helvetica, verdana; font-size: 12px; font-weight: normal; } table.bh_table td { padding: 8px 3px 8px 3px; } table.ghb_table { font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; border-width: 0 0 1px 0; border-color: #000000; border-style: solid; } table.ghb_table th { background-color: #C0C0C0; border-top: 0; border-left: solid 1px #FFFFFF; border-bottom: 0; border-right: solid 1px #FFFFFF; font-family: arial, sans-serif, helvetica, verdana; font-weight: normal; padding: 1px 0 1px 0; text-align: center; vertical-align: top; } table.ghb_table th h3 { font-family: arial, sans-serif, helvetica, verdana; font-size: 12px; font-weight: normal; } table.ghb_table td { background-color: #FFFFFF; border-top: double 3px #000000; border-left: solid 1px #000000; border-bottom: 0; border-right: solid 1px #000000; padding: 8px 3px 8px 3px; } table.dh_table { border: 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.dh_table th { background-color: #FFFFFF; background-image: url(http://cdn.cpu-world.com/Images/middle-dotted.gif); background-repeat: repeat-x; color: #000000; font-weight: bold; font-family: verdana, helvetica, arial, sans-serif; padding: 1px 0 1px 0; text-align: center; } table.dh_table td { padding: 2px 3px 2px 3px; } table.dh_table ul { padding-left: 25px; list-style-type: circle; } .dh_table_head { background-color: #FFFFFF; } .dh_head { background-color: #FFFFFF; } .dh_table p { padding: 8px 3px 1px 3px; } table.lh_table { border-color: #E8E8E8; border-style: solid; border-width: 1px 0 1px 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.lh_table th { border-left: solid 1px #E8E8E8; color: #404040; font-weight: bold; font-family: verdana, helvetica, arial, sans-serif; padding: 3px; text-align: center; /*background: url(/Images/test-9.jpg) repeat-x;*/ background-color: #E0E0E0; } table.lh_table tr.row1:hover, table.lh_table tr.row2:hover { /*background-color: #FFE8C0;*/ /*background: url(/Images/test-b12.jpg) no-repeat left;*/ background-color: #D8E8FF; } table.lh_table td { border-left: dashed 1px #E0E0E0; padding: 2px 3px 2px 3px; line-height: 130%; vertical-align: top; } table.lh_table tr.row1 td { border-left: solid 1px #F0F0F0; } table.lh_table tr.row2 td { border-left: solid 1px #F8F8F8; } table.lh_table td:first-child, table.lh_table th:first-child, table.lh_table tr.row1 th:first-child, table.lh_table tr.row2 th:first-child { border-left: 0; } .lh_subheadl { color: #000000; background-color: #E0E0E0; font-weight: normal; text-align: left; } .lh_subhead, table.lh_table tr.lh_subhead td { color: #000000; background-color: #E0E0E0; font-weight: normal; text-align: center; /*background: url(/Images/test-10.jpg) repeat-x;*/ background-color: #FFFFFF; border-top: 1px solid #FFFFFF; border-bottom: 1px solid #E0E0E0; border-left: 1px solid #FFFFFF !important; } .lh_subheadr { color: #000000; background-color: #E0E0E0; font-weight: normal; text-align: right; } table.sh_table { border: 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.sh_table th { background-color: #A0A0A0; background-image: none; color: #FFFFFF; font-weight: bold; font-family: verdana, helvetica, arial, sans-serif; font-size: 90%; padding: 1px; text-align: center; border-top: 1px solid #D0D0D0; border-bottom: 1px solid #808080; border-left: 1px solid #FFFFFF; } table.sh_table tr th.title { /*background-color: #808080;*/ background-color: #C0C0C0; border-top: 1px solid #E0E0E0; border-bottom: 1px solid #FFFFFF; /*color: #FFD060;*/ color: #404040; } table.sh_table td { padding: 2px 3px 2px 3px; border-left: solid 1px #E0E0E0; } table.sh_table td:first-child, table.sh_table th:first-child { border-left: 0; } tr.sh_subhead { color: #808080; font-size: 90%; background-color: #E0E0E0; font-weight: bold; text-align: center; } tr.sh_subhead td { border-left: 1px solid #C0C0C0; } table.id_table { border: 0; font-family: arial, sans-serif, helvetica, verdana; font-size: 12px; } table.id_table td { padding: 1px 4px 1px 4px; } .dh_div { background-color: #FFFFFF; background-image: url(http://cdn.cpu-world.com/Images/middle-dotted.gif); background-repeat: repeat-x; color: #000000; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; font-weight: bold; margin: 8px 0 0 0; padding: 1px 0 1px 0; text-align: center; } table.relc_table th { color: #000000; background-color: #C0C0C0; } table.relc_table td { font-size: 90%; } table.relc_table tr.rel_family td { font-weight: bold; color: #606060; background-color: #E0E0E0; border-top: 1px solid #FFFFFF; border-bottom: 1px solid #FFFFFF; } .yhb_footer, .yhb_ifooter { margin: 10px 0 0 0; /*background-color: #E0E0E0;*/ border-top: 1px solid #E0E0E0; color: #808080; font-family: verdana, helvetica, arial, sans-serif; font-size: 9px; padding: 0 5px 0 5px; text-align: right; clear: both; } .yhb_ifooter { margin-left: 10px; margin-right: 10px; } a.white_link:link, a.white_link:active, a.white_link:visited { color: #E0B060; text-decoration: underline; } a.white_link:hover { color: #FFD060; text-decoration: underline; } a.black_link:link, a.black_link:active, a.black_link:visited { color: #000000; text-decoration: none; } a.black_link:hover { color: #404040; text-decoration: none; } a.wnu_link:link, a.wnu_link:visited { color: #E0B060; /*color: #80A0E0;*/ /*color: #8080FF;*/ font-weight: bold; text-decoration: none; } a.wnu_link:hover, a.wnu_link:active { color: #FFD060; /*color: #A0C0FF;*/ font-weight: bold; text-decoration: none; } table.sh_table th a:link, table.sh_table th a:visited { color: #FFFFFF; } table.sh_table th a:hover, table.sh_table th a:active { color: #FFD060; } a.bb_link:link, a.bb_link:active, a.bb_link:visited { /*color: #4060A0;*/ /*color: #C09020;*/ color: #404040; text-decoration: none; font-weight: bold; } a.bb_link:hover { /*color: #6080C0;*/ /*color: #FFD060;*/ color: #404040; text-decoration: none; font-weight: bold; } a:link { text-decoration: underline; /*color: #A07020;*/ color: #0000C0; } a:active, a:hover { /*color: #A07020;*/ color: #0000E0; text-decoration: underline; } a:visited { /*color: #704000;*/ color: #000080; text-decoration: underline; } .error, .comment_error { color: #C00000; font-weight: bold; padding: 10px; } .warning { color: #C00000; font-weight: normal; padding: 10px; } .field_error { color: #C00000; font-size: 11px; font-weight: normal; padding: 2px; } .info { color: #00C000; font-weight: bold; padding: 10px; } .note { color: #7070C0; font-weight: bold; padding: 10px; } .cpu_div { /* padding: 8px 5px 3px 5px;*/ } .cpu_name { padding: 1px 3px 1px 3px; margin: 5px 0 0 0; } .cpu_name h2, .cpu_name h3 { margin: 0; padding: 1px; background-color: #C0C0C0; } .cpu_head { background-color: #FFFFFF; background-image: url(http://cdn.cpu-world.com/Images/middle-dotted.gif); background-repeat: repeat-x; color: #000000; font-weight: bold; font-family: verdana, helvetica, arial, sans-serif; margin-top: 6px; padding: 1px 0 1px 0; text-align: center; } .cpu_desc { padding: 3px; line-height: 130%; } .cpu_diff { font-size: 11px; text-align: center; padding: 5px 0 5px 0; /*display: none;*/ } .cpu_picd { font-size: 10px; /*font-weight: bold;*/ color: #808080; padding: 0 3px 0 10px; } .cf_desc { padding: 8px 5px 5px 5px; line-height: 130%; } .cf_desc0 { } .cf_req { background-color: #FFF8E8; padding: 5px 5px 5px 5px; margin: 5px 10px 5px 10px; line-height: 130%; } .cf_desc_h { padding: 8px 3px 3px 3px; font-weight: bold; } .cf_desc_t { padding: 0 3px 3px 20px; } .cf_buttons { text-align: right; padding-top: 12px; padding-bottom: 3px; } table td.cpu_spec_h, table td.cpuid_h, .cpu_spec_h, .info_content h2 { background-color: #C0C0C0; vertical-align: top; padding-left: 20px; text-align: center; font-weight: bold; border-bottom: 1px solid #A0A0A0; } .cf_news_h { text-align: left; background-color: #C0C0C0; border-bottom: 1px solid #A0A0A0; padding: 1px 3px 1px 3px; font-weight: bold; } .cf_news_t { padding-top: 5px; padding-left: 20px; } table.dh_table td h2, table.sh_table td h2 { margin-top: 0; } table td.sup_head { color: #FFD060; background-color: #808080; font-weight: bold; text-align: center; width: 20%; } table td.sup_desc { color: #404040; background-color: #C0C0C0; font-weight: bold; padding-left: 15px; width: 80%; } .T_tags { line-height: 180%; background-color: #E8E8E8; margin-top: 3px; } .T_on, .T_on a { background-color: #7070C0; color: #FFFFFF !important; text-decoration: none !important; padding: 2px; margin: 0 5px 2px 5px !important; } .T_off, .T_off a { background-color: #E8E8E8; color: #404040; text-decoration: none !important; padding: 2px; margin: 0 5px 2px 5px !important; } .T_all, .T_all a { font-weight: bold; padding: 1px 3px 1px 3px; } .clear, .comment_clear { width: 100%; clear: both; } .cw_help, .cw_help a, .cw_help a:visited { color: #FFFFFF; font-size: 10px; font-weight: normal; text-decoration: none; background-color: #FFD060; padding: 0; } .cw_help a:hover { color: #000000; text-decoration: none; } .f_icon { font-size: 90%; /* font-family: arial, sans-serif, verdana, helvetica; */ /* background-color: #808080; */ /* color: #FFFFFF; */ border: 1px solid #808080; padding: 1px; } .breadcrumbs, table.yhb_table td.breadcrumbs { font-family: verdana, helvetica, arial, sans-serif; padding: 2px 10px 2px 10px; background-color: #FFF0D0; font-size: 85%; } /* Tabs - based on http://akrabat.com/dynamic-javascript-tabs/ */ .tab-content { border: 1px solid #808080; padding: 3px; _width: 100%; } .tab-header { position: relative; height: 16px; } .tab-header ul.tab-list { margin: 0; padding: 0; position: absolute; bottom: -1px; width: 100%; /* (50em) a width is required for Opera, older Mozilla browsers, and Konqueror browsers */ } .tab-header ul.tab-list li { display: inline; list-style: none; margin: 0; } .tab-header ul.tab-list a, .tab-header ul.tab-list span, .tab-header ul.tab-list a.tab-active { width: 16%; display: block; float: left; padding: 1px 0; margin: 0 1px 0 0; text-align: center; font-size: 90%; text-decoration: none; color: #404040; } .tab-header ul.tab-list span,.tab-header ul.tab-list a.tab-active,.tab-header ul.tab-list a.tab-active:hover { border-width: 1px 1px 0 1px; border-style: solid; border-color: #808080; background-color: #FFFFFF; color: #000000; padding-bottom: 2px; } /* a link in a background tab */ .tab-header ul.tab-list a { border-width: 1px 1px 0 1px; border-style: solid; border-color: #808080; background-color: #E0E0E0; } /* hover on a background tab */ .tab-header ul.tab-list a:hover { color: #000000; padding-bottom: 1px; } .tab { } /* use another colour for active tabs in the second tab set */ #tab-container-2 .tab-header ul.tab-list span, #tab-container-2 .tab-header ul.tab-list a.tab-active, #tab-container-2 .tab-header ul.tab-list a.tab-active:hover { background-color: #FFFFFF; color: black; } table.bm_tablec { border-top: 1px solid #808080; border-bottom: 1px solid #808080; } table.bm_tablec th { text-align: center; font-weight: bold; font-size: 11px; padding: 1px 3px 1px 3px; background-image: none; background-color: #C0C0C0; color: #FFFFFF; } table.bm_tablec td { padding: 2px 3px 2px 3px; font-size: 11px; } .bm_barc { padding: 0; margin: 0; } .AutoSuggest, .PDMenu { border: 2px solid #C0C0C0; background-color: #FFFFFF; padding: 2px; color: #000000; text-decoration: none; font-family: verdana, helvetica, arial, sans-serif; font-size: 11px; } .PDMenuParent, a.PDMenuParent { background-color: #808080; color: #FFF0D0; } .AutoSuggestNone, .PDMenuNone { padding: 1px; color: #C00000; width: auto; } .AutoSuggestSeparator { border: 0; border-top: 1px solid #C0C0C0; width: 90%; text-align: center; } .AutoSuggestChoice, .AutoSuggestChoice2, .AutoSuggestSelected, .AutoSuggestSelected2, .PDMenuChoice, .PDMenuSelected { padding: 2px; text-decoration: none; text-align: left; padding-left: 12px; text-indent: -10px; } .AutoSuggestChoice, .AutoSuggestChoice2, .PDMenuChoice { color: #000000; } .AutoSuggestChoice2 { color: #000000; background-color: #E0E0E0; } .AutoSuggestChoice i, .AutoSuggestChoice2 i, .PDMenuChoice i { font-weight: normal; color: #808080; } .AutoSuggestSelected, .AutoSuggestSelected2, .PDMenuSelected { color: #FFFFFF; background-color: #404040; cursor: pointer; } .AutoSuggestSelected b, .AutoSuggestSelected2 b, .PDMenuSelected b { font-weight: normal; color: #C0C0C0; } .vs_same1, table td.vs_same1, .vs_same2, table td.vs_same2 { color: #808080; } .vs_diff1 { background-color: #FFE8E8; } .vs_diff2 { background-color: #F0E0E0; } .bg_diff5, table td.bg_diff5 { background: url(http://cdn.cpu-world.com/Images/back_bench5.gif) repeat-y; padding: 0; } /* CPU cores (merged) */ table.cr_table { padding: 0 0 0 0; margin: 0 0 0 0; font-family: verdana, helvetica, arial, sans-serif; font-size: 12px; } table.cr_table th { padding: 1px; border: 1px solid #FFFFFF; background-color: #C0C0C0; margin: 0 0 0 0; font-weight: bold; text-align: center; font-size: 11px; } table.cr_table td { padding: 5px; border: 1px solid #FFFFFF; border-bottom: 1px solid #C0C0C0; margin: 0 0 0 0; vertical-align: top; line-height: 130%; } table.cr_table td.cr_cur { background-color: #E0E0E0; border-bottom: 0; } ul.cr_gen { font-size: 90%; list-style-type: none; margin-top: 5px; margin-bottom: 5px; margin-left: 0; padding-left: 1em; text-indent: -1em; } ul.cr_gen li { border: 0 !important; } div.cr_rel1 { margin: 0 0 0 3px; padding-left: 14px; border-left: 1px solid #000000; padding-bottom: 8px; } div.cr_rel2 { margin: 0 0 0 3px; padding-left: 14px; border-left: 1px solid #000000; background-image: url(http://cdn.cpu-world.com/Images/c_am.gif); background-repeat: no-repeat; padding-bottom: 8px; } div.cr_rel3 { margin: 0 0 0 3px; padding-left: 15px; border-left: 0; background-image: url(http://cdn.cpu-world.com/Images/c_ab.gif); background-repeat: no-repeat; } div.cr_cpus, span.cr_cpus { font-size: 90%; font-weight: normal; color: #606060; } .img_zoom { cursor: pointer; border: 2px solid #FFFFFF; } .img_nozoom { border: 2px solid #FFFFFF; } .ef_note { text-align: right; padding: 0 10px 3px 0; background-color: #FFFFFF; border-bottom: 1px solid #E0E0E0; } .worse, td.worse, tr.row1 td.worse { background-color: #FFE0E0; } tr.row2 td.worse { background-color: #F0C8C8; } .better, td.better, tr.row1 td.better { background-color: #E0FFE0; } tr.row2 td.better { background-color: #C8F0C8; } .worsef { background-color: #FFE0E0; text-decoration: line-through; } ------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline; filename=Logo.gif Content-Type: image/gif; name=Logo.gif Content-Location: http://cdn.cpu-world.com/Images/Logo.gif Content-Transfer-Encoding: Base64 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 r62guK3gr5BwCuV3fsmqGvOQRv/TXFSXdG7AAakQTa3gcoE7BwnABDOgC+FHt5MA tyBgDBNAfi+HBaWatsbHB0lwAHOABbxgDV3ohWH4D0//YAMJkAScwIWRawdoa4SY qQYXUAbb272uA4bBZAcsMA32Wr1MUAFoZ37TpAVPaAIGkAYMZX5MJQdq6Q+HqQM8 4AyqAAzd+4XOdQdCMA02oAGUAIHmlwcxp6dJQAG/ALmu0wBqAgHS0LYDsA1dCEzc 24V5oAUcQL3I5wZJAAPZSwWbwHokkIKJAAYzkAAQcKqMYAZ/gI15tqDB6AYmwL5l YMM47FxOdAdaIAY5cL/GBwEa8AOWkAjYuAlYoAZwSA0zcAEAsMXmwAJEmI7UoMRU kAesl4JczAjSAAEcEMZjfF2EYMa82wIdkMXXNbFqab0dYAYAwMY57ERajI00mbow 9Ky2DKABHTAHliAHAPBUABAYGGeVJCwGQtAGZYAFWGAJPNACZxyMENDIHXABkTzJ TgUARWEAPjyin9u2V+bJYHABOiCefKAB2AsGnlwGZjCCy1nKejwHYEAI5mAHUDkH asABVskHBtABhsDLZdAGB2ADwIjEuVMDnWwJT+ABRMgHfQADqGzMhMDNc6AF0kzN 1rzIR5wDfcATzJN17OyabuDOLeABLeA+gzvP/IzAfEANGtACGmADDEDF/Yx0pWwD JkYN8nzQDv3QEB3REj3RFF3RFn3RGJ3RGr3RHN3RHv3RIB3SIj3SJF3SJn3SKJ3S Ko10AQEAOw== ------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline; filename=show_ads.js Content-Type: text/javascript; charset=ISO-8859-1; name=show_ads.js Content-Location: http://pagead2.googlesyndication.com/pagead/show_ads.js Content-Transfer-Encoding: Quoted-Printable (function(){var g=3Dtrue,h=3Dnull,i=3Dfalse,j=3D(new Date).getTime();var= k=3Dthis,aa=3Dfunction(a,b){var c=3Da.split("."),d=3Dk;!(c[0]in d)&&d.e= xecScript&&d.execScript("var "+c[0]);for(var e;c.length&&(e=3Dc.shift())= ;)!c.length&&b!=3D=3Dvoid 0?d[e]=3Db:d=3Dd[e]?d[e]:d[e]=3D{}},ba=3Dfunct= ion(a,b,c){return a.call.apply(a.bind,arguments)},ca=3Dfunction(a,b,c){i= f(!a)throw Error();if(arguments.length>2){var d=3DArray.prototype.slice.= call(arguments,2);return function(){var c=3DArray.prototype.slice.call(a= rguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}else r= eturn function(){return a.apply(b, arguments)}},l=3Dfunction(a,b,c){l=3DFunction.prototype.bind&&Function.p= rototype.bind.toString().indexOf("native code")!=3D-1?ba:ca;return l.app= ly(h,arguments)};var da=3D/&/g,ea=3D//g,ha=3D/\"/g,m=3D{"\x00= ":"\\0","\u0008":"\\b","\u000c":"\\f","\n":"\\n","\r":"\\r","\t":"\\t","= \u000b":"\\x0B",'"':'\\"',"\\":"\\\\"},r=3D{"'":"\\'"},ja=3Dfunction(a){= for(var b=3D0,c=3DString(ia).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split(= "."),a=3DString(a).replace(/^[\s\xa0]+|[\s\xa0]+$/g,"").split("."),d=3DM= ath.max(c.length,a.length),e=3D0;b=3D=3D0&&eb)return 1;return 0};v= ar ka=3Ddocument,u=3Dwindow;var v=3Dfunction(a){return a=3D=3D"true"?g:a= =3D=3D"false"?i:i},la=3D/^([\w-]+\.)*([\w-]{2,})(\:[0-9]+)?$/,w=3Dfuncti= on(a){return!a?"pagead2.googlesyndication.com":(a=3Da.match(la))?a[0]:"p= agead2.googlesyndication.com"};var z=3DparseFloat("0"),ma=3DisNaN(z)||z>= 1||z<0?0:z;var na=3Dv("false"),oa=3Dv("false"),pa=3Dv("false"),qa=3Dv("f= alse");var sa=3Dfunction(){return w("")};var A,B,C,E,ta=3Dfunction(){ret= urn k.navigator?k.navigator.userAgent:h};E=3DC=3DB=3DA=3Di;var F;if(F=3D= ta()){var ua=3Dk.navigator;A=3DF.indexOf("Opera")=3D=3D0;B=3D!A&&F.index= Of("MSIE")!=3D-1;C=3D!A&&F.indexOf("WebKit")!=3D-1;E=3D!A&&!C&&ua.produc= t=3D=3D"Gecko"}var G=3DB,H=3DE,va=3DC,I; a:{var J=3D"",K;if(A&&k.opera)var L=3Dk.opera.version,J=3Dtypeof L=3D=3D= "function"?L():L;else if(H?K=3D/rv\:([^\);]+)(\)|;)/:G?K=3D/MSIE\s+([^\)= ;]+)(\)|;)/:va&&(K=3D/WebKit\/(\S+)/),K)var wa=3DK.exec(ta()),J=3Dwa?wa[= 1]:"";if(G){var xa,ya=3Dk.document;xa=3Dya?ya.documentMode:void 0;if(xa>= parseFloat(J)){I=3DString(xa);break a}}I=3DJ}var ia=3DI,M=3D{},za=3D{},A= a=3Dfunction(){return za[9]||(za[9]=3DG&&document.documentMode&&document= .documentMode>=3D9)};!G||Aa();if(H||G)if(!G||!Aa())H&&(M["1.9.1"]||(M["1= .9.1"]=3Dja("1.9.1")>=3D0));G&&(M["9"]||(M["9"]=3Dja("9")>=3D0));w("");v= ar N=3Dfunction(a){return!!a&&typeof a=3D=3D"function"&&!!a.call},Ba=3Df= unction(a,b){if(!(arguments.length<2))for(var c=3D1,d=3Darguments.length= ;c");b=3D"border:none;height:"+c+"px;margin:0;padding:0;position= :relative;visibility:visible;width:"+b+"px";return['',d.join(" "),""].join("")};var Ra=3Dfunction(){}= ,Ta=3Dfunction(a,b,c){switch(typeof b){case "string":Sa(b,c);break;case = "number":c.push(isFinite(b)&&!isNaN(b)?b:"null");break;case "boolean":c.= push(b);break;case "undefined":c.push("null");break;case "object":if(b=3D= =3Dh){c.push("null");break}if(b instanceof Array){var d=3Db.length;c.pus= h("[");for(var e=3D"",f=3D0;f\"]/.test(W)&&(W.indexOf("&")!=3D-1&&(W=3DW.replace(da,"&")),W.= indexOf("<")!=3D-1&&(W=3DW.replace(ea,"<")),W.indexOf(">")!=3D-1&&(W=3D= W.replace(fa,">")),W.indexOf('"')!=3D-1&&(W=3DW.replace(ha,"""))= );Wa=3DW;V.prototype.set=3Dfunction(a,b){this.e.handlers[a]=3Db;this.a.a= ddEventListener&&this.a.addEventListener("load",l(this.j,this,a),i)};V.p= rototype.j=3Dfunction(a){var a=3Dthis.a.document.getElementById(a),b=3Da= .contentWindow.document;if(a.onload&&b&&(!b.body||!b.body.firstChild))a.= onload()}; V.prototype.k=3Dfunction(){if(this.e.img){var a=3Dthis.e.log,b=3Dthis.a.= document;if(a.length)b=3D["http://",sa(),"/pagead/gen_204?id=3Diframecop= y&log=3D",O(a.join("-")),"&url=3D",O(b.URL.substring(0,512)),"&ref=3D",O= (b.referrer.substring(0,512))].join(""),a.length=3D0,a=3Dnew Image,this.= e.img.push(a),a.src=3Db}};var Xa=3Dfunction(){var a=3D"script",b=3Dw("")= ;return["<",a,' src=3D"',[qa?"https":"http","://",b,"/pagead/js/r2011102= 6/r20110914/show_ads_impl.js"].join(""),'">"].join("")},Ya=3Dfun= ction(a,b,c,d){return function(){var e=3Di;d&&La().al(3E4);try{var f;try= {f=3D!!a.document.getElementById(b).contentWindow.document}catch(ra){f=3D= i}if(f){var t=3D a.document.getElementById(b).contentWindow,n=3Dt.document;if(!n.body||!n= .body.firstChild)n.open(),t.google_async_iframe_close=3Dg,n.write(c)}els= e{var o=3Da.document.getElementById(b).contentWindow,p;f=3Dc;f=3DString(= f);if(f.quote)p=3Df.quote();else{t=3D['"'];for(n=3D0;n31&&Ja<127)D=3DR;else{var q=3DR;if(q in r)D=3Dr[q];else if= (q in m)D=3Dr[q]=3Dm[q];else{var x=3Dq,y=3Dq.charCodeAt(0);if(y>31&&y<12= 7)x=3Dq;else{if(y<256){if(x=3D"\\x",y<16|| y>256)x+=3D"0"}else x=3D"\\u",y<4096&&(x+=3D"0");x+=3Dy.toString(16).toU= pperCase()}D=3Dr[q]=3Dx}}ga=3DD}pb[qb]=3Dga}t.push('"');p=3Dt.join("")}o= .location.replace("javascript:"+p)}e=3Dg}catch(xb){o=3DFa().google_jobru= nner,Ka(o)&&o.rl()}e&&(new V(a)).set(b,Ya(a,b,c,i))}};window.google_load= er_used=3Dg;(function(a){if(!("google_onload_fired"in a))a.google_onload= _fired=3Di,Ca(a,function(){a.google_onload_fired=3Dg})})(window);if(!win= dow.google_loader_experiment){var Za;a:{var $a=3D["async_bad_black","blo= ck_bad_black"];if(!(Math.random()<1.0E-4)){var ab=3DMath.random();if(ab<= ma){Za=3D$a[Math.floor(ab/ma*$a.length)];break a}}Za=3Dh}window.google_l= oader_experiment=3DZa||""||"launch"}var bb; a:{try{if(window.google_enable_async!=3D=3Dg&&window.google_loader_exper= iment=3D=3D"blockodd"&&window.top.location.hostname.length%2=3D=3D1){bb=3D= i;break a}}catch(cb){}bb=3Dg}var db;if(db=3Dbb){var eb;if(window.google_= enable_async=3D=3D=3Di)eb=3D0;else{var fb=3Dnavigator.userAgent,gb=3Dwin= dow.google_loader_experiment;eb=3D(Oa.test(fb)?i:Pa.test(fb)?gb=3D=3D"as= ync_bad_black":g)&&!window.google_container_id&&(!window.google_ad_outpu= t||window.google_ad_output=3D=3D"html")}db=3Deb} if(db){var hb=3Dwindow;hb.google_unique_id?++hb.google_unique_id:hb.goog= le_unique_id=3D1;var X=3Dwindow;if(!X.google_slot_list||!X.google_slot_l= ist.push)X.google_slot_list=3D[];X.google_slot_list.push([X.google_ad_sl= ot||"",X.google_ad_format||"",X.google_ad_width||"",X.google_ad_height||= ""].join("."));for(var Y=3Dwindow,_script$$inline_171=3D"script",Z,T=3DY= ,S=3D{allowtransparency:'"true"',frameborder:'"0"',height:'"'+Y.google_a= d_height+'"',hspace:'"0"',marginwidth:'"0"',marginheight:'"0"',onload:'"= '+Wa+'"',scrolling:'"no"', vspace:'"0"',width:'"'+Y.google_ad_width+'"'},ib=3DT.document,$=3DS.id,j= b=3D0;!$||T.document.getElementById($);)$=3D"aswift_"+jb++;S.id=3D$;S.na= me=3D$;ib.write(Qa());Z=3D$;var kb;Y.google_page_url&&(Y.google_page_url= =3DString(Y.google_page_url));for(var lb=3D[],mb=3D0,nb=3DU.length;mb<",_script$$inline_171,">",kb,"google_= show_ads_impl=3Dtrue;google_unique_id=3D",Y.google_unique_id,';google_as= ync_iframe_id=3D"',Z,'";google_start_time=3D',j,";",yb?'google_loader_ex= periment=3D"'+yb+'";':"","google_bpp=3D",wb>j?wb-j:1,";",Xa(),""].join("");(Y.document.getElementById(Z)= ?Ma:Na)(Ya(Y,Z,zb,g))}else window.q=3Dj,document.write(Xa());})(); ------------LkJeSl8GS9sfggkpwGdDkc Content-Disposition: inline; filename=cpu_world2.js Content-Type: application/javascript; charset=iso-8859-1; name=cpu_world2.js Content-Location: http://cdn.cpu-world.com/cpu_world2.js Content-Transfer-Encoding: Base64 Ly8gY3B1X3dvcmxkLmpzDQpmdW5jdGlvbiBuZXdQaWNXaW5kb3cgKHBfdGl0bGUs IHBfaW1hZ2UsIHBfdywgcF9oKQ0Kew0KCW5ld0dlbmVyaWNXaW5kb3cgKHBfdGl0 bGUsIHBfaW1hZ2UsIHBfdyArIDcwLCBwX2ggKyA5NSwgJ0NXX1pvb20nLA0KCQkn KGMpIENvcHlyaWdodCAyMDAzIC0gMjAxMCBHZW5uYWRpeSBTaHZldHMnKTsNCn0N Cg0KZnVuY3Rpb24gbmV3V2luZG93IChwX3NjcmlwdCwgcF93LCBwX2gpDQp7DQoJ dmFyIGxfdyA9IHBfdyArIDMwOw0KCXZhciBsX2ggPSBwX2ggKyA1MDsNCg0KCXZh ciBHZW5XaW5kb3cgPSBvcGVuIChwX3NjcmlwdCwgJ0dlbmVyaWNXaW5kb3cnLCAn cmVzaXphYmxlPXllcyxzY3JvbGxiYXJzPXllcyx3aWR0aD0nICsNCgkJbF93ICsg JyxoZWlnaHQ9JyArIGxfaCk7DQoJaWYgKEdlbldpbmRvdy5vcGVuZXIgPT0gbnVs bCkgR2VuV2luZG93Lm9wZW5lciA9IHNlbGY7DQp9DQoNCmZ1bmN0aW9uIG5ld0Rp ZVdpbmRvdyAocF90aXRsZSwgcF9pbWFnZSwgcF93LCBwX2gpDQp7DQoJbmV3R2Vu ZXJpY1dpbmRvdyAocF90aXRsZSwgcF9pbWFnZSwgcF93ICsgNzAsIHBfaCArIDk1 LCAnQ1dfRGllX1pvb20nLA0KCQknKGMpIENvcHlyaWdodCAyMDA1IC0gMjAwNyA8 QSBIUkVGPSIvaW5mby9kaWVfcGljdHVyZXMuaHRtbCI+V2lsbGlhbSBCbGFpcjwv QT4nKTsNCn0NCg0KZnVuY3Rpb24gbmV3VXBsb2FkV2luZG93IChwX3RpdGxlLCBw X2ltYWdlLCBwX3csIHBfaCkNCnsNCgluZXdHZW5lcmljV2luZG93IChwX3RpdGxl LCBwX2ltYWdlLCBwX3cgKyA3MCwgcF9oICsgOTUsICdDV19VcGxvYWRfWm9vbScs DQoJCScoYykgSW1hZ2UgaXMgY29weXJpZ2h0ZWQgYnkgaXRzIGF1dGhvcicpOw0K fQ0KDQpmdW5jdGlvbiBuZXdQcmljZUNoYXJ0V2luZG93IChwX3RpdGxlLCBwX2lt YWdlLCBwX3csIHBfaCkNCnsNCglyZXR1cm4gbmV3R2VuZXJpY1dpbmRvdyAocF90 aXRsZSwgcF9pbWFnZSwgcF93ICsgNzAsIHBfaCArIDk1LA0KCQknQ1dfUHJpY2VD aGFydCcsICcoYykgQ29weXJpZ2h0IDIwMDMgLSAyMDEwIEdlbm5hZGl5IFNodmV0 cycpOw0KfQ0KDQpmdW5jdGlvbiBuZXdHZW5lcmljV2luZG93IChwX3RpdGxlLCBw X2ltYWdlLCBwX3csIHBfaCwgcF93bmFtZSwgcF9jb3B5cmlnaHQpDQp7DQoJdmFy IENXX1BXID0gb3BlbiAoJycsIHBfd25hbWUsICdyZXNpemFibGU9eWVzLHNjcm9s bGJhcnM9eWVzLHdpZHRoPScgKw0KCQlwX3cgKyAnLGhlaWdodD0nICsgcF9oKTsN CglDV19QVy5kb2N1bWVudC53cml0ZSgnPEhUTUw+PEhFQUQ+PFRJVExFPicgKyBw X3RpdGxlICsNCgkJJzwvVElUTEU+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVm PSJodHRwOi8vY2RuLmNwdS13b3JsZC5jb20vY3B1X3dvcmxkMi5jc3MiIHR5cGU9 InRleHQvY3NzIj48L0hFQUQ+JyArDQoJCSc8Ym9keSBiZ2NvbG9yPSIjRkZGRkZG IiB0ZXh0PSIjMDAwMDAwIj4nICsNCgkJJzxkaXYgY2xhc3M9InNoZHciPjxkaXYg Y2xhc3M9InNoZHcyIj48ZGl2IGNsYXNzPSJjcHVfY29udGVudCI+JyArDQoJCSc8 ZGl2IGNsYXNzPSJ5aGIiPjxoMT4nICsgcF90aXRsZSArICc8L2gxPjwvZGl2Picg Kw0KCQknPGRpdiBzdHlsZT0icGFkZGluZzogNXB4OyB0ZXh0LWFsaWduOiBjZW50 ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGUiPjxJTUcgU1JDPSInICsNCgkJcF9p bWFnZSArICciIGFsdD0iJyArIHBfdGl0bGUgKyAnIj48L2Rpdj48L2Rpdj48L2Rp dj48L2Rpdj4nICsNCgkJJzxkaXYgY2xhc3M9InNoZHciPjxkaXYgY2xhc3M9InNo ZHcyIj48dGFibGUgY2xhc3M9ImZ0X3RhYmxlIj4nICsNCgkJJzx0cj48dGggY29s c3Bhbj0yIGhlaWdodD0iMyI+PGRpdiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogM3B4 Ij48L2Rpdj48L3RoPjwvdHI+JyArDQoJCSc8dHI+PHRkPjxhIGhyZWY9Ii90ZXJt c19hbmRfY29uZGl0aW9ucy5odG1sIj5UZXJtcyBhbmQgQ29uZGl0aW9uczwvYT48 L3RkPicgKw0KCQknPHRkIGFsaWduPSJyaWdodCI+JyArIHBfY29weXJpZ2h0ICsN CgkJJzwvdGQ+PHRyPjx0aCBjb2xzcGFuPTIgaGVpZ2h0PSIzIj48ZGl2IHN0eWxl PSJtYXJnaW4tYm90dG9tOiAzcHgiPjwvZGl2PjwvdGg+PC90cj4nICsNCgkJJzwv dGFibGU+PC9kaXY+PC9kaXY+PC9CT0RZPjwvSFRNTD4nKTsNCglDV19QVy5kb2N1 bWVudC5jbG9zZSgpOw0KCXJldHVybiBmYWxzZTsNCn0NCg0KdmFyIENXX2ViYXlf ZGF0YSA9IG5ldyBBcnJheSAoKTsNCmZ1bmN0aW9uCVVwZGF0ZVdoZXJlVG9CdXkg KCkNCnsNCgl2YXIgZGl2X29iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICgn Q1dfV0hFUkVfVE9fQlVZJyk7DQoJaWYJKGRpdl9vYmogPT0gbnVsbCkJcmV0dXJu Ow0KCWlmCSh0eXBlb2YoQ1dfd2hlcmVfdG9fYnV5KSA9PSAndW5kZWZpbmVkJykJ cmV0dXJuOw0KDQoJdmFyIGksIGosIGxhYmVsLCB1cmwsIGV4dHJhOw0KCXZhciBw cmljZXMgPSBuZXcgQXJyYXkgKCk7DQoJdmFyIGxlbiA9IENXX3doZXJlX3RvX2J1 eS5sZW5ndGg7DQoJdmFyIGxhc3QgPSAnJzsNCgl2YXIgbGkgPSAnJzsNCgl2YXIg dWwgPSAwOw0KCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMykNCgl7DQoJCXVy bCA9IENXX3doZXJlX3RvX2J1eVtpXTsNCgkJbGFiZWwgPSBDV193aGVyZV90b19i dXlbaSArIDFdOw0KCQlleHRyYSA9IENXX3doZXJlX3RvX2J1eVtpICsgMl07DQoJ CWlmICh1cmwgPT0gJycpDQoJCXsNCgkJCWlmCShsaSAhPSAnJykNCgkJCXsNCgkJ CQlwcmljZXMucHVzaCAoJzxsaT4nICsgbGkgKyAnPC9saT4nKTsNCgkJCQlsYXN0 ID0gJyc7DQoJCQkJbGkgPSAnJzsNCgkJCX0NCgkJCWlmCSh1bCkNCgkJCXsNCgkJ CQlwcmljZXMucHVzaCAoIjwvdWw+IiwgIjxicj4iKTsNCgkJCQl1bCA9IDA7DQoJ CQl9DQoJCQlwcmljZXMucHVzaCAobGFiZWwpOw0KCQl9DQoJCWVsc2UNCgkJew0K CQkJaWYJKHVsID09IDApDQoJCQl7DQoJCQkJcHJpY2VzLnB1c2ggKCI8dWwgc3R5 bGU9J21hcmdpbjogMDsgcGFkZGluZy1sZWZ0OiAyMHB4OyBsaW5lLWhlaWdodDog MjAwJSc+Iik7DQoJCQkJdWwgPSAxOw0KCQkJfQ0KCQkJaWYJKGxhYmVsICE9IGxh c3QpDQoJCQl7DQoJCQkJaWYJKGxpICE9ICcnKQ0KCQkJCXsNCgkJCQkJcHJpY2Vz LnB1c2goJzxsaT4nICsgbGkgKyAnPC9saT4nKTsNCgkJCQkJbGkgPSAnJzsNCgkJ CQl9DQoJCQkJbGFzdCA9IGxhYmVsOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJCWxpICs9 ICc8YnI+JzsNCg0KCQkJaWYJKCh1cmwgPT0gJ0VCQVkxJyl8fCh1cmwgPT0gJ0VC QVkyJykpDQoJCQl7DQoJCQkJaiA9ICh1cmwgPT0gJ0VCQVkxJyk/IDA6IDE7DQoJ CQkJQ1dfZWJheV9kYXRhW2pdID0gZXh0cmE7DQoJCQkJbGkgKz0gJzxhIGhyZWY9 IiMiIG9uQ2xpY2s9IkNXX0pTRnVuY3Rpb25PbihldmVudCwgNjAwLCAzNTAsIFNo b3dFYmF5RGlhbG9nLCAnICsNCgkJCQkJaiArICcpOyByZXR1cm4gZmFsc2UiIHJl bD0ibm9mb2xsb3ciPicgKyBsYWJlbCArICc8L2E+JzsNCgkJCX0NCgkJCWVsc2UN CgkJCQlsaSArPSAnPGEgaHJlZj0iJyArIHVybCArICciIHRhcmdldD0iX2JsYW5r IiByZWw9Im5vZm9sbG93Ij4nICsNCgkJCQkJbGFiZWwgKyAiPC9hPiAiICsgZXh0 cmE7DQoJCX0NCgl9DQoJaWYJKGxpICE9ICcnKQlwcmljZXMucHVzaCgnPGxpPicg KyBsaSArICc8L2xpPicpOw0KCWRpdl9vYmouaW5uZXJIVE1MID0gIjxkaXYgY2xh c3M9J3NoZHcnPjxkaXYgY2xhc3M9J3NoZHcyJz5cbiIgKw0KCQkiPGg0IGNsYXNz PSdzaWRlX2g0YSc+V2hlcmUgdG8gYnV5PC9oND5cbjxkaXYgY2xhc3M9J3NpZGVf ZmJveCc+XG4iICsNCgkJcHJpY2VzLmpvaW4oIlxuIikgKyAiPC91bD5cbjwvZGl2 PjwvZGl2PjwvZGl2PiI7DQp9DQoNCmZ1bmN0aW9uIFNob3dFYmF5RGlhbG9nIChw X2FyZ3MpDQp7DQoJdmFyIGFyciA9IENXX2ViYXlfZGF0YVtwX2FyZ3NdOw0KCXZh ciBtYSA9IGFyclswXTsNCgl2YXIgZmEgPSBhcnJbMV07DQoJdmFyIG1vID0gYXJy WzJdOw0KCXZhciBwbiA9IGFyclszXTsNCgl2YXIgc3MgPSBhcnJbNF07DQoJdmFy IHFzID0gYXJyWzVdOw0KDQoJdmFyIGxpbmtzID0gMDsNCgl2YXIgdGV4dCA9ICI8 aDM+ZUJheSBzZWFyY2g8L2gzPiI7DQoJaWYJKG1vICE9ICcnKQ0KCXsNCgkJdGV4 dCArPSAiPHA+PGEgaHJlZj0naHR0cDovL3JvdmVyLmViYXkuY29tL3JvdmVyLzEv NzExLTUzMjAwLTE5MjU1LTAvMT9pY2VwX2ZmMz05JmFtcDtwdWI9NTU3NDgzNzU1 NyZhbXA7dG9vbGlkPTEwMDAxJmFtcDtjYW1waWQ9NTMzNjM1MDY0MiZhbXA7Y3Vz dG9taWQ9JmFtcDtpY2VwX3VxPSIgKyBlbmNvZGVVUklDb21wb25lbnQobWEpICsg IisiICsgZW5jb2RlVVJJQ29tcG9uZW50KG1vKSArICImYW1wO2ljZXBfc2VsbGVy SWQ9JmFtcDtpY2VwX2V4X2t3PSZhbXA7aWNlcF9zb3J0Qnk9MTUmYW1wO2ljZXBf Y2F0SWQ9JmFtcDtpY2VwX21pblByaWNlPSZhbXA7aWNlcF9tYXhQcmljZT0mYW1w O2lwbj1wc21haW4mYW1wO2ljZXBfdmVjdG9yaWQ9MjI5NDY2JmFtcDtrd2lkPTkw MjA5OSZhbXA7bXRpZD04MjQmYW1wO2t3PWxnJyB0YXJnZXQ9J19ibGFuaycgcmVs PSdub2ZvbGxvdyc+U2VhcmNoIGZvciBtYW51ZmFjdHVyZXIgbmFtZSBhbmQgbW9k ZWwgbnVtYmVyICIgKyBtbyArICI8L2E+IiArDQoJCQkiPGRpdiBjbGFzcz0nc21h bGxlcicgc3R5bGU9J3BhZGRpbmctbGVmdDogMTBweCc+TW9kZWwgbnVtYmVycyBp cyB0aGUgbW9zdCBjb21tb24gd2F5IGZvciBtb3N0IGVCYXkgc2VsbGVycyB0byBk ZXNjcmliZSB0aGVpciBpdGVtcywgdGhlcmVmb3JlIHNlYXJjaGluZyBieSBtb2Rl bCBudW1iZXIgdXN1YWxseSByZXN1bHRzIGluIHRoZSBtb3N0IGNvbXBsZXRlIGxp c3Qgb2YgaXRlbXMgZm9yIHNhbGUuPC9kaXY+IjsNCgkJbGlua3MrKzsNCgl9DQoJ aWYJKHNzICE9ICcnKQ0KCXsNCgkJdGV4dCArPSAiPHA+PGEgaHJlZj0naHR0cDov L3JvdmVyLmViYXkuY29tL3JvdmVyLzEvNzExLTUzMjAwLTE5MjU1LTAvMT9pY2Vw X2ZmMz05JmFtcDtwdWI9NTU3NDgzNzU1NyZhbXA7dG9vbGlkPTEwMDAxJmFtcDtj YW1waWQ9NTMzNjM1MDY0MiZhbXA7Y3VzdG9taWQ9JmFtcDtpY2VwX3VxPSIgKyBl bmNvZGVVUklDb21wb25lbnQobWEpICsgIisiICsgZW5jb2RlVVJJQ29tcG9uZW50 KHNzKSArICImYW1wO2ljZXBfc2VsbGVySWQ9JmFtcDtpY2VwX2V4X2t3PSZhbXA7 aWNlcF9zb3J0Qnk9MTUmYW1wO2ljZXBfY2F0SWQ9JmFtcDtpY2VwX21pblByaWNl PSZhbXA7aWNlcF9tYXhQcmljZT0mYW1wO2lwbj1wc21haW4mYW1wO2ljZXBfdmVj dG9yaWQ9MjI5NDY2JmFtcDtrd2lkPTkwMjA5OSZhbXA7bXRpZD04MjQmYW1wO2t3 PWxnJyB0YXJnZXQ9J19ibGFuaycgcmVsPSdub2ZvbGxvdyc+U2VhcmNoIGZvciBw cm9kdWN0aW9uIFMtc3BlYyBudW1iZXIocyk8L2E+IiArDQoJCQkiPGRpdiBjbGFz cz0nc21hbGxlcicgc3R5bGU9J3BhZGRpbmctbGVmdDogMTBweCc+VXNlIHRoaXMg c2VhcmNoIHRvIGxvY2F0ZSBwb29ybHkgbGlzdGVkIGl0ZW1zLCB3aGVyZSB0aGUg c2VsbGVyIHByb3ZpZGVzIG9ubHkgUy1zcGVjIG51bWJlciwgYW5kIG5vIG1vZGVs IG51bWJlciBvZiB0aGUgY2hpcC48L2Rpdj4iOw0KCQlsaW5rcysrOw0KCX0NCglp ZgkocXMgIT0gJycpDQoJew0KCQl0ZXh0ICs9ICI8cD48YSBocmVmPSdodHRwOi8v cm92ZXIuZWJheS5jb20vcm92ZXIvMS83MTEtNTMyMDAtMTkyNTUtMC8xP2ljZXBf ZmYzPTkmYW1wO3B1Yj01NTc0ODM3NTU3JmFtcDt0b29saWQ9MTAwMDEmYW1wO2Nh bXBpZD01MzM2MzUwNjQyJmFtcDtjdXN0b21pZD0mYW1wO2ljZXBfdXE9IiArIGVu Y29kZVVSSUNvbXBvbmVudChtYSkgKyAiKyIgKyBlbmNvZGVVUklDb21wb25lbnQo cXMpICsgIiZhbXA7aWNlcF9zZWxsZXJJZD0mYW1wO2ljZXBfZXhfa3c9JmFtcDtp Y2VwX3NvcnRCeT0xNSZhbXA7aWNlcF9jYXRJZD0mYW1wO2ljZXBfbWluUHJpY2U9 JmFtcDtpY2VwX21heFByaWNlPSZhbXA7aXBuPXBzbWFpbiZhbXA7aWNlcF92ZWN0 b3JpZD0yMjk0NjYmYW1wO2t3aWQ9OTAyMDk5JmFtcDttdGlkPTgyNCZhbXA7a3c9 bGcnIHRhcmdldD0nX2JsYW5rJyByZWw9J25vZm9sbG93Jz5TZWFyY2ggZm9yIFFE RiMgKHNhbXBsZSAvIFEtc3BlYykgbnVtYmVyKHMpPC9hPiIgKw0KCQkJIjxkaXYg Y2xhc3M9J3NtYWxsZXInIHN0eWxlPSdwYWRkaW5nLWxlZnQ6IDEwcHgnPlRoaXMg c2VhcmNoIGlzIHVzZWZ1bCBpZiB5b3UncmUgbG9va2luZyBmb3IgcXVhbGlmaWNh dGlvbiBhbmQvb3IgZW5naW5lZXJpbmcgc2FtcGxlcyBvZiB0aGUgY2hpcC48L2Rp dj4iOw0KCQlsaW5rcysrOw0KCX0NCglpZgkocG4gIT0gJycpDQoJew0KCQl0ZXh0 ICs9ICI8cD48YSBocmVmPSdodHRwOi8vcm92ZXIuZWJheS5jb20vcm92ZXIvMS83 MTEtNTMyMDAtMTkyNTUtMC8xP2ljZXBfZmYzPTkmYW1wO3B1Yj01NTc0ODM3NTU3 JmFtcDt0b29saWQ9MTAwMDEmYW1wO2NhbXBpZD01MzM2MzUwNjQyJmFtcDtjdXN0 b21pZD0mYW1wO2ljZXBfdXE9IiArIGVuY29kZVVSSUNvbXBvbmVudChtYSkgKyAi KyIgKyBlbmNvZGVVUklDb21wb25lbnQocG4pICsiJmFtcDtpY2VwX3NlbGxlcklk PSZhbXA7aWNlcF9leF9rdz0mYW1wO2ljZXBfc29ydEJ5PTE1JmFtcDtpY2VwX2Nh dElkPSZhbXA7aWNlcF9taW5QcmljZT0mYW1wO2ljZXBfbWF4UHJpY2U9JmFtcDtp cG49cHNtYWluJmFtcDtpY2VwX3ZlY3RvcmlkPTIyOTQ2NiZhbXA7a3dpZD05MDIw OTkmYW1wO210aWQ9ODI0JmFtcDtrdz1sZycgdGFyZ2V0PSdfYmxhbmsnIHJlbD0n bm9mb2xsb3cnPlNlYXJjaCBmb3IgbWFudWZhY3R1cmVyIG5hbWUgYW5kIHBhcnQg bnVtYmVyKHMpPC9hPjxkaXYgY2xhc3M9J3NtYWxsZXInIHN0eWxlPSdwYWRkaW5n LWxlZnQ6IDEwcHgnPiI7DQoJCWlmCShtbyAhPSAnJykNCgkJew0KCQkJaWYJKG1h ID09ICdJbnRlbCcpDQoJCQkJdGV4dCArPSAiU2VhcmNoIGJ5IHBhcnQgbnVtYmVy IGlzIG5vdCB2ZXJ5IGVmZmVjdGl2ZSBmb3IgbW9kZXJuIEludGVsIGNoaXBzLCBi dXQgd2UgcHJvdmlkZSBpdCBqdXN0IGluIGNhc2UuIjsNCgkJCWVsc2UgaWYJKG1h ID09ICdBTUQnKQ0KCQkJCXRleHQgKz0gIlNlYXJjaCBieSBwYXJ0IG51bWJlciBp cyB1c2VmdWwgZm9yIHNwZWNpZmljIEFNRCBwYXJ0IG51bWJlciwgaS5lLiBDUFUg d2l0aCBzcGVjaWZpYyBjaGFyYWN0ZXJpc3RpY3MgYW5kIGNvcmUgc3RlcHBpbmcu IjsNCgkJCWVsc2UNCgkJCQl0ZXh0ICs9ICJTZWFyY2ggYnkgcGFydCBudW1iZXIg bWF5IGJlIGxlc3MgZWZmZWN0aXZlIHRoYW4gc2VhcmNoIGJ5IG1vZGVsIG51bWJl ci4gVXNlIGl0IGlmIHRoZSBzZWFyY2ggYnkgbW9kZWwgbnVtYmVyIGRvZXNuJ3Qg cmV0dXJuIGFueSByZXN1bHRzLiI7DQoJCX0NCgkJZWxzZQ0KCQkJdGV4dCArPSAi U2VhcmNoIGJ5IHBhcnQgbnVtYmVyIGlzIGEgaGl0IG9yIG1pc3MuIEl0IG1heSB3 b3JrIHdlbGwgZm9yIHBhcnQgbnVtYmVycywgdGhhdCBtYXRjaCBtYXJraW5ncyBv biB0aGUgY2hpcCwgYnV0IGNvdWxkIGJlIHVzZWxlc3MgZm9yIGFsbCBvdGhlcnMg cGFydCBudW1iZXJzLiI7DQoJCXRleHQgKz0gIjwvZGl2PiI7DQoJCWlmCSgobGlu a3MgPT0gMCkmJihtYS5tYXRjaCgvIC8pKSkNCgkJew0KCQkJdGV4dCArPSAiPHA+ PGEgaHJlZj0naHR0cDovL3JvdmVyLmViYXkuY29tL3JvdmVyLzEvNzExLTUzMjAw LTE5MjU1LTAvMT9pY2VwX2ZmMz05JmFtcDtwdWI9NTU3NDgzNzU1NyZhbXA7dG9v bGlkPTEwMDAxJmFtcDtjYW1waWQ9NTMzNjM1MDY0MiZhbXA7Y3VzdG9taWQ9JmFt cDtpY2VwX3VxPSIgKyBlbmNvZGVVUklDb21wb25lbnQocG4pICsiJmFtcDtpY2Vw X3NlbGxlcklkPSZhbXA7aWNlcF9leF9rdz0mYW1wO2ljZXBfc29ydEJ5PTE1JmFt cDtpY2VwX2NhdElkPSZhbXA7aWNlcF9taW5QcmljZT0mYW1wO2ljZXBfbWF4UHJp Y2U9JmFtcDtpcG49cHNtYWluJmFtcDtpY2VwX3ZlY3RvcmlkPTIyOTQ2NiZhbXA7 a3dpZD05MDIwOTkmYW1wO210aWQ9ODI0JmFtcDtrdz1sZycgdGFyZ2V0PSdfYmxh bmsnIHJlbD0nbm9mb2xsb3cnPlNlYXJjaCBmb3IgcGFydCBudW1iZXIocykgb25s eTwvYT4iICsNCgkJCQkJIjxkaXYgY2xhc3M9J3NtYWxsZXInIHN0eWxlPSdwYWRk aW5nLWxlZnQ6IDEwcHgnPlNvbWUgZUJheSBzZWxsZXJzIGRvIG5vdCBsaWtlIHVz aW5nIGxvbmcgbWFudWZhY3R1cmVyIG5hbWVzLCBsaWtlIE5hdGlvbmFsIFNlbWlj b25kdWN0b3IsIGFuZCB0aGV5IG1heSBhYmJyZWF2aWF0ZSB0aGUgbmFtZSwgdGhl cmVmb3JlIGxvb2tpbmcgb25seSBmb3IgcGFydCBudW1iZXIocykgbWF5IHJldHVy biBtb3JlIHJlc3VsdHMuPC9kaXY+IjsNCgkJfQ0KCX0NCgl0ZXh0ICs9ICI8cCBj bGFzcz0nc21hbGxlcic+SWYgZUJheSBzZWFyY2ggZG9lcyBub3QgcmV0dXJuIGFu eSBpdGVtcyB0aGVuIGNoZWNrIHRoZSAnSW5jbHVkZSBkZXNjcmlwdGlvbicgY2hl Y2tib3ggb24gdGhlIGVCYXkgc2VhcmNoIHBhZ2UsIGFuZCByZXBlYXQgdGhlIHNl YXJjaCI7DQoNCglyZXR1cm4gV3JhcERpYWxvZyh0ZXh0KTsNCn0NCg0KZnVuY3Rp b24gV3JhcERpYWxvZyAocF90ZXh0KQ0Kew0KCXJldHVybiAiPGRpdiBzdHlsZT0n Ym9yZGVyOiAwOyBwYWRkaW5nOiA1cHg7IGJhY2tncm91bmQ6IHVybCgvSW1hZ2Vz L2JhY2tfdDUwLnBuZyknPiIgKw0KCQkiPGRpdiBzdHlsZT0nYm9yZGVyOiAycHgg c29saWQgI0MwQzBDMDsgcGFkZGluZzogNXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAj RkZGRkZGOyB0ZXh0LWFsaWduOiBsZWZ0Jz4iICsNCgkJKChwX3RleHQubWF0Y2gg KC9eRVJST1I6LykpPyAiPGRpdiBjbGFzcz0nZXJyb3InPiIgKyBwX3RleHQgKyAi PC9kaXY+IjogcF90ZXh0KSArDQoJCSI8Zm9ybT48cCBhbGlnbj0nY2VudGVyJz48 aW5wdXQgdHlwZT0nYnV0dG9uJyBuYW1lPSdBQ1RJT04nIHZhbHVlPSdDbG9zZScg b25DbGljaz0nQ1dfVGltZXJPZmYoKScgY2xhc3M9J2lidXR0b24nPjwvZm9ybT4i ICsNCgkJIjwvZGl2PjwvZGl2PiI7DQp9DQoNClNldE9ubG9hZChVcGRhdGVXaGVy ZVRvQnV5KTsNCg0KdmFyIENXX2RlZmVyX2ltYWdlcyA9IG5ldyBBcnJheSAoKTsN CmZ1bmN0aW9uCURlZmVySW1hZ2VMb2FkaW5nICgpDQp7DQoJdmFyIGltZ3MgPSBk b2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7DQoJdmFyIGksIGlt ZywgeTEsIHkyLCBwYXJlbnQ7DQoJdmFyIHkxdyA9IGRvY3VtZW50LmJvZHkuc2Ny b2xsVG9wIC0gMTA7DQoJdmFyIHkydyA9IHkxdyArIGRvY3VtZW50LmJvZHkuY2xp ZW50SGVpZ2h0ICsgMjA7DQoJdmFyIGxlbiA9IGltZ3MubGVuZ3RoOw0KCWZvciAo aSA9IDA7IGkgPCBsZW47IGkrKykNCgl7DQoJCWltZyA9IGltZ3NbaV07DQoJCWlm CSgoaW1nLndpZHRoID09IG51bGwpfHwoaW1nLmhlaWdodCA9PSBudWxsKSkgIGNv bnRpbnVlOw0KCQl5MSA9IGltZy5vZmZzZXRUb3A7DQoJCXBhcmVudCA9IGltZy5v ZmZzZXRQYXJlbnQ7DQoJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkNCgkJew0KCQkJ eTEgKz0gcGFyZW50Lm9mZnNldFRvcCAtIHBhcmVudC5zY3JvbGxUb3A7DQoJCQlw YXJlbnQgPSBwYXJlbnQub2Zmc2V0UGFyZW50Ow0KCQl9DQoJCXkyID0geTEgKyBp bWcub2Zmc2V0SGVpZ2h0Ow0KCQlpZgkoKHkyID49IHkxdykmJih5MSA8PSB5Mncp KQljb250aW51ZTsNCg0KCQlpbWcuc2V0QXR0cmlidXRlKCdzcmNfb3JpZycsIGlt Zy5zcmMpOw0KCQlpbWcucmVtb3ZlQXR0cmlidXRlKCdzcmMnKTsNCgkJQ1dfZGVm ZXJfaW1hZ2VzLnB1c2ggKGltZyk7DQoJfQ0KDQoJd2luZG93Lm9uc2Nyb2xsID0g Q2hlY2tEZWZlcmVkSW1hZ2VzOw0KfQ0KDQpmdW5jdGlvbiBDaGVja0RlZmVyZWRJ bWFnZXMgKCkNCnsNCgl2YXIgbGVuID0gQ1dfZGVmZXJfaW1hZ2VzLmxlbmd0aDsN CglpZgkobGVuID09IDApCXJldHVybjsNCgl2YXIgaSwgeTEsIHkyLCBpbWcsIHBh cmVudDsNCgl2YXIgeTF3ID0gZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgLSAxMDsN Cgl2YXIgeTJ3ID0geTF3ICsgZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQgKyAy MDsNCglmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspDQoJew0KCQlpbWcgPSBDV19k ZWZlcl9pbWFnZXNbaV07DQoJCXkxID0gaW1nLm9mZnNldFRvcDsNCgkJcGFyZW50 ID0gaW1nLm9mZnNldFBhcmVudDsNCgkJd2hpbGUgKHBhcmVudCAhPSBudWxsKQ0K CQl7DQoJCQl5MSArPSBwYXJlbnQub2Zmc2V0VG9wIC0gcGFyZW50LnNjcm9sbFRv cDsNCgkJCXBhcmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7DQoJCX0NCgkJeTIg PSB5MSArIGltZy5vZmZzZXRIZWlnaHQ7DQoJCWlmCSgoeTIgPCB5MXcpfHwoeTEg PiB5MncpKQljb250aW51ZTsNCgkJaW1nLnNldEF0dHJpYnV0ZSgnc3JjJywgaW1n LmdldEF0dHJpYnV0ZSgnc3JjX29yaWcnKSk7DQoJCWltZy5yZW1vdmVBdHRyaWJ1 dGUoJ3NyY19vcmlnJyk7DQoJCUNXX2RlZmVyX2ltYWdlcy5zcGxpY2UgKGksIDEp Ow0KCQlsZW4tLTsNCgkJaS0tOw0KCX0NCn0NCg0KLy9TZXRPbmxvYWQoRGVmZXJJ bWFnZUxvYWRpbmcpOw0KDQpmdW5jdGlvbglPbk9mZiAoKQ0Kew0KCXZhciBpLCBv YmosIGZpZWxkLCB2aXNpYmxlMjsNCgl2YXIgdmlzaWJsZSA9IDE7DQoJdmFyIGxl biA9IGFyZ3VtZW50cy5sZW5ndGg7DQoJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsr KQ0KCXsNCgkJZmllbGQgPSBhcmd1bWVudHNbaV07DQoJCWlmCShmaWVsZCA9PSAn JykNCgkJew0KCQkJdmlzaWJsZS0tOw0KCQkJY29udGludWU7DQoJCX0NCgkJb2Jq ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKGZpZWxkKTsNCgkJaWYJKG9iaiA9 PSBudWxsKQljb250aW51ZTsNCgkJdmlzaWJsZTIgPSAodmlzaWJsZSA8IDApPw0K CQkJKChvYmouc3R5bGUuZGlzcGxheSA9PSAnbm9uZScpPyAxOiAwKTogdmlzaWJs ZTsNCgkJb2JqLnN0eWxlLmRpc3BsYXkgPSAodmlzaWJsZTIpPw0KCQkJKChvYmou bm9kZU5hbWUubWF0Y2goL14oVEFCTEV8VEJPRFl8VFIpJC8pKT8gJyc6ICdibG9j aycpOiAnbm9uZSc7DQoJfQ0KCXJldHVybiBmYWxzZTsNCn0NCg0KZnVuY3Rpb24J U2V0dXBTZWFyY2ggKCkNCnsNCglkb2N1bWVudC5UT1BfRl9TRS5TRUFSQ0gudmFs dWUgPSAnIFNlYXJjaCAnOw0KCWRvY3VtZW50LlRPUF9GX1NFLlNFQVJDSC5zdHls ZS5jb2xvciA9ICcjRDBEMEQwJzsNCglkb2N1bWVudC5UT1BfRl9JRC5QQVJULnZh bHVlID0gJyBJZGVudGlmeSAnOw0KCWRvY3VtZW50LlRPUF9GX0lELlBBUlQuc3R5 bGUuY29sb3IgPSAnI0QwRDBEMCc7DQoJaWYJKENXX2Nvb2tpZV9zdGF0dXMgIT0g LTEpDQoJew0KCQl2YXIgc3RhdGUgPSBHZXRDb29raWUoJ1NFJyk7DQoJCWlmCShz dGF0ZSA9PSAnSScpDQoJCXsNCgkJCU9uT2ZmKCJUT1BfSUQiLCAiIiwgIlRPUF9T RSIpOw0KCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIlRPUF9SSSIpLmNoZWNr ZWQgPSB0cnVlOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbglTZXR1cEZpbHRlciAo KQ0Kew0KCXZhciBvYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnQ1dfRklM VEVSJyk7DQoJaWYJKG9iaiA9PSBudWxsKQlyZXR1cm47DQoJb2JqLnZhbHVlID0g JyBGaWx0ZXIgJzsNCglvYmouc3R5bGUuY29sb3IgPSAnI0QwRDBEMCc7DQp9DQoN CmZ1bmN0aW9uIFN3U2VhcmNoIChwX3R5cGUpDQp7DQoJaWYJKHBfdHlwZSA9PSAn UycpDQoJCU9uT2ZmKCJUT1BfU0UiLCAiIiwgIlRPUF9JRCIpOw0KCWVsc2UNCgkJ T25PZmYoIlRPUF9JRCIsICIiLCAiVE9QX1NFIikNCglTZXRDb29raWUgKCdTRScs IHBfdHlwZSwgMzY1KTsNCn0NCg0KdmFyIENXX2Nvb2tpZV9zdGF0dXMgPSAxOw0K dmFyIENXX2xhc3RfdmlzaXQ7DQoNCmZ1bmN0aW9uIEdldENvb2tpZSAocF9uYW1l KQ0Kew0KDQoJaWYJKENXX2Nvb2tpZV9zdGF0dXMgPT0gLTEpCXJldHVybiAnJzsN Cgl2YXIgYyA9IGRvY3VtZW50LmNvb2tpZTsNCgl2YXIgc3RhcnQgPSBjLmluZGV4 T2YgKHBfbmFtZSArICc9Jyk7DQoJaWYJKHN0YXJ0ID09IC0xKQlyZXR1cm4gJyc7 DQoJdmFyIGxlbiA9IHN0YXJ0ICsgcF9uYW1lLmxlbmd0aCArIDE7DQoJdmFyIGVu ZCA9IGMuaW5kZXhPZiAoIjsiLCBsZW4pOw0KCWlmCShlbmQgPT0gLTEpCQllbmQg PSBjLmxlbmd0aDsNCglyZXR1cm4gdW5lc2NhcGUgKGMuc3Vic3RyaW5nIChsZW4s IGVuZCkpOw0KfQ0KDQpmdW5jdGlvbiBTZXRDb29raWUgKHBfbmFtZSwgcF92YWx1 ZSwgcF9kYXlzKQ0Kew0KDQoJaWYJKENXX2Nvb2tpZV9zdGF0dXMgPT0gLTEpCXJl dHVybjsNCgl2YXIgZXhwX2RhdGUgPSBuZXcgRGF0ZSgpOw0KCWV4cF9kYXRlLnNl dFRpbWUgKGV4cF9kYXRlLmdldFRpbWUgKCkgKyBwX2RheXMgKiA4NjQwMDAwMCk7 DQoJdmFyIGV4cGlyZXMgPSBleHBfZGF0ZS50b0dNVFN0cmluZyAoKTsNCglkb2N1 bWVudC5jb29raWUgPSBwX25hbWUgKyAiPSIgKyBlc2NhcGUgKHBfdmFsdWUpICsN CgkJIjsgZXhwaXJlcz0iICsgZXhwaXJlcyArICI7IHBhdGg9LyI7DQp9DQoNCi8v CVNlZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIGNvb2tpZXMNCmlmCShHZXRDb29r aWUgKCdYWCcpID09ICIiKQ0Kew0KCVNldENvb2tpZSAoJ1hYJywgJ09LJywgMSk7 DQoJaWYJKEdldENvb2tpZSAoJ1hYJykgIT0gIk9LIikNCgkJQ1dfY29va2llX3N0 YXR1cyA9IC0xOw0KfQ0KaWYJKENXX2Nvb2tpZV9zdGF0dXMgIT0gLTEpDQoJU2V0 VmlzaXRUaW1lKCk7DQoNCmZ1bmN0aW9uCVNldFZpc2l0VGltZSAoKQ0Kew0KDQoJ aWYJKENXX2Nvb2tpZV9zdGF0dXMgPT0gLTEpCXJldHVybjsNCgl2YXIgY3VycmVu dF9kYXRlID0gbmV3IERhdGUoKTsNCgl2YXIgbF9ub3cgPSBwYXJzZUludCAoY3Vy cmVudF9kYXRlLmdldFRpbWUgKCkgLyAxMDAwKTsNCg0KCS8vIEZpbmQgb3V0IHdo ZW4gdGhlIHVzZXIgdmlzaXRlZCB1cyB0aGUgbGFzdCB0d28gdGltZXMNCgl2YXIg bF9sYXN0ID0gR2V0Q29va2llICgnTFYxJyk7DQoJbF9sYXN0ID0gKGxfbGFzdCA9 PSAnJyk/IGxfbm93OiBwYXJzZUludCAobF9sYXN0KTsNCgl2YXIgbF9sYXN0MiA9 IEdldENvb2tpZSAoJ0xWMicpOw0KCWxfbGFzdDIgPSAobF9sYXN0MiA9PSAiIik/ IGxfbm93OiBwYXJzZUludCAobF9sYXN0Mik7DQoNCgkvLyBEZXRlcm1pbmUgd2hh dCB0aW1lIHRvIHVzZSBhcyB0aGUgbGFzdCB2aXNpdCB0aW1lIC0gaWYgdGhlIGxh c3QgdGltZQ0KCS8vIGlzIGxlc3MgdGhhbiBvbmUgaG91ciBhZ28gdGhlbiB1c2Ug dGhlIHRpbWUgYmVmb3JlIHRoZSBsYXN0IHRpbWUNCglpZgkobF9ub3cgPiAobF9s YXN0ICsgMzYwMCkpDQoJew0KCQlDV19sYXN0X3Zpc2l0ID0gbF9sYXN0Ow0KCQls X2xhc3QyID0gbF9sYXN0Ow0KCX0NCgllbHNlDQoJCUNXX2xhc3RfdmlzaXQgPSBs X2xhc3QyOw0KCWxfbGFzdCA9IGxfbm93Ow0KCS8vIFNhdmUgdXBkYXRlZCB2aXNp dCB0aW1lcw0KCVNldENvb2tpZSAoJ0xWMScsIGxfbGFzdCwgMzY1KTsNCglTZXRD b29raWUgKCdMVjInLCBsX2xhc3QyLCAzNjUpOw0KfQ0KDQp2YXIgQ1dfZGF0YV9v bmxvYWQgPSBuZXcgQXJyYXkgKCk7DQp2YXIgQ1dfb25sb2FkX2luaXRpYWxpemVk ID0gMDsNCmZ1bmN0aW9uCVNldE9ubG9hZCAocF9mdW5jKQ0Kew0KDQoJaWYJKHdp bmRvdy5hZGRFdmVudExpc3RlbmVyKQ0KCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5l cigibG9hZCIsIHBfZnVuYywgZmFsc2UpOw0KCWVsc2UgaWYgKHdpbmRvdy5hdHRh Y2hFdmVudCkNCgkJd2luZG93LmF0dGFjaEV2ZW50ICgib25sb2FkIiwgcF9mdW5j KTsNCgllbHNlDQoJew0KCQlpZgkoIUNXX29ubG9hZF9pbml0aWFsaXplZCkNCgkJ ew0KCQkJaWYJKHdpbmRvdy5vbmxvYWQpDQoJCQkJQ1dfZGF0YV9vbmxvYWQucHVz aCh3aW5kb3cub25sb2FkKTsNCg0KCQkJaWYJKCh3aW5kb3cub25sb2FkX2N3ID09 IG51bGwpJiYod2luZG93Lm9ubG9hZCAhPSBudWxsKSkNCgkJCQl3aW5kb3cub25s b2FkX2N3ID0gd2luZG93Lm9ubG9hZDsNCgkJCS8vIEFzc2lnbiBuZXcgb25sb2Fk IGZ1bmN0aW9uDQoJCQl3aW5kb3cub25sb2FkID0gQ1dfUHJvY2Vzc09ubG9hZDsN CgkJfQ0KCQlDV19vbmxvYWRfaW5pdGlhbGl6ZWQgPSAxOw0KCQlDV19kYXRhX29u bG9hZC5wdXNoIChwX2Z1bmMpOw0KCX0NCn0NCg0KZnVuY3Rpb24JUHJvY2Vzc09u bG9hZCAoKQ0Kew0KDQoJdmFyIGxlbiA9IENXX2RhdGFfb25sb2FkLmxlbmd0aDsN Cglmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKQ0KCXsNCgkJQ1dfZGF0YV9v bmxvYWRbaV0oKTsNCgl9DQoJQ1dfZGF0YV9vbmxvYWQubGVuZ3RoID0gMDsNCn0N Cg0KdmFyIFdfZGVsYXkgPSA1MDA7DQp2YXIJV19mdW5jdGlvbjsNCnZhcglXX3Rp bWVvdXRfaWQ7DQp2YXIJV19vYmo7DQp2YXIJV19maWx0ZXJfbGFzdDsNCg0KZnVu Y3Rpb24JV2F0Y2hpbmdfU3RhcnQgKHBfZXZlbnQsIHBfb2JqLCBwX2Z1bmN0aW9u LCBwX2RlbGF5KQ0Kew0KCVdfb2JqID0gcF9vYmo7DQoJV19mdW5jdGlvbiA9IHBf ZnVuY3Rpb247DQoJV19kZWxheSA9IChwX2RlbGF5ID09IG51bGwpPyA1MDA6IHBf ZGVsYXk7DQoJcF9vYmoub25rZXl1cCA9IFdhdGNoaW5nX1Jlc2V0VGltZXI7DQoJ cF9vYmoub25rZXlkb3duID0gV2F0Y2hpbmdfUmVzZXRUaW1lcjsNCglXYXRjaGlu Z19SZXNldFRpbWVyICgpOw0KCVdfZmlsdGVyX2xhc3QgPSBwX29iai52YWx1ZTsN Cn0NCg0KZnVuY3Rpb24JV2F0Y2hpbmdfU3RvcCAocF9ldmVudCwgcF9vYmosIHBf ZnVuY3Rpb24pDQp7DQoJcF9vYmoub25rZXl1cCA9IG51bGw7DQoJcF9vYmoub25r ZXlkb3duID0gbnVsbDsNCglpZgkoV190aW1lb3V0X2lkKQkJd2luZG93LmNsZWFy VGltZW91dCAoV190aW1lb3V0X2lkKTsNCglXX3RpbWVvdXRfaWQgPSBudWxsOw0K CWlmCShwX2Z1bmN0aW9uICE9IG51bGwpDQoJCXBfZnVuY3Rpb24gKHBfZXZlbnQp Ow0KfQ0KDQpmdW5jdGlvbglXYXRjaGluZ19SZXNldFRpbWVyICgpDQp7DQoJaWYJ KFdfdGltZW91dF9pZCkJd2luZG93LmNsZWFyVGltZW91dCAoV190aW1lb3V0X2lk KTsNCglXX3RpbWVvdXRfaWQgPSB3aW5kb3cuc2V0VGltZW91dChXYXRjaGluZ19U aW1lb3V0LCBXX2RlbGF5KTsNCn0NCg0KZnVuY3Rpb24JV2F0Y2hpbmdfVGltZW91 dCAoKQ0Kew0KCVdfdGltZW91dF9pZCA9IG51bGw7DQoJdmFyIHZhbHVlID0gV19v YmoudmFsdWU7DQoJaWYJKChXX2ZpbHRlcl9sYXN0ID09IG51bGwpfHwoV19maWx0 ZXJfbGFzdCAhPSB2YWx1ZSkpDQoJCVdfZnVuY3Rpb24gKFdfb2JqLmlkLCB2YWx1 ZSk7DQoJV19maWx0ZXJfbGFzdCA9IHZhbHVlOw0KfQ0KDQovLyBnc19saW5rcy5q cw0KLy8gRHluYW1pYyBMaW5rIGJ1aWxkZXIgc2NyaXB0DQovLyBDb3B5cmlnaHQg MjAwNyBHZW5uYWRpeSBTaHZldHMNCi8vIFRoZSBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwNCi8vIFB1Ymxp YyBMaWNlbnNlIDMuMA0KDQp2YXIgTF91cmxQcmVmaXggPSAnJzsNCnZhciBMX2Fs bExpbmtzID0gbmV3IEFycmF5ICgNCidBQk0nLCAnL0dsb3NzYXJ5L0EvQWR2YW5j ZWRfQml0X01hbmlwdWxhdGlvbi5odG1sJywNCidBTUQ2NCcsICcvR2xvc3Nhcnkv QS9BTUQ2NF90ZWNobm9sb2d5Lmh0bWwnLA0KJ0FVVE9IQUxUX01PREUnLCAnL0ds b3NzYXJ5L0EvQXV0b19IYWx0X1Bvd2VyX0Rvd25fc3RhdGUuaHRtbCcsDQonQ0xP Q0tfTVVMVCcsICcvR2xvc3NhcnkvQi9CdXNfY2xvY2tfbXVsdGlwbGllci5odG1s JywNCidDT09MQ09SRScsICcvR2xvc3NhcnkvQy9Db29sQ29yZV90ZWNobm9sb2d5 Lmh0bWwnLA0KJ0NPUkVfTkFNRScsICcvR2xvc3NhcnkvQy9Db3JlX25hbWUuaHRt bCcsDQonQ09SRV9TVEVQJywgJy9HbG9zc2FyeS9DL0NvcmVfc3RlcHBpbmcuaHRt bCcsDQonRERBJywgJy9HbG9zc2FyeS9EL0R1YWxfRHluYW1pY19BY2NlbGVyYXRp b24uaHRtbCcsDQonREVFUF9TTEVFUF9NT0RFJywgJy9HbG9zc2FyeS9EL0RlZXBf U2xlZXBfc3RhdGUuaHRtbCcsDQonREVFUEVSX1NMRUVQJywgJy9HbG9zc2FyeS9E L0RlZXBlcl9TbGVlcF9zdGF0ZS5odG1sJywNCidEUEQnLCAnL0dsb3NzYXJ5L0Qv RGVlcF9Qb3dlcl9Eb3duX3N0YXRlLmh0bWwnLA0KJ0RVQUxfRFlOX1BPV0VSJywg Jy9HbG9zc2FyeS9EL0R1YWxfZHluYW1pY19wb3dlcl9tYW5hZ2VtZW50Lmh0bWwn LA0KJ0RZTl9DQUNIRV9TSVpJTkcnLCAnL0dsb3NzYXJ5L0QvRHluYW1pY19DYWNo ZV9TaXppbmcuaHRtbCcsDQonRFlOX0ZTQl9GUkVRJywgJy9HbG9zc2FyeS9EL0R5 bmFtaWNfRlNCX0ZyZXF1ZW5jeV9Td2l0Y2hpbmcuaHRtbCcsDQonRU02NFQnLCAn L0dsb3NzYXJ5L0UvRXh0ZW5kZWRfTWVtb3J5XzY0X3RlY2hub2xvZ3lfKEVNNjRU KS5odG1sJywNCidFTkhfREVFUEVSX1NMRUVQJywgJy9HbG9zc2FyeS9FL0VuaGFu Y2VkX0RlZXBlcl9TbGVlcF9zdGF0ZS5odG1sJywNCidFTkhfUE9XRVJOT1cnLCAn L0dsb3NzYXJ5L0UvRW5oYW5jZWRfUG93ZXJOb3dfdGVjaG5vbG9neS5odG1sJywN CidFTkhfU1NURVAnLCAnL0dsb3NzYXJ5L0UvRW5oYW5jZWRfU3BlZWRTdGVwX3Rl Y2hub2xvZ3kuaHRtbCcsDQonRVZQX1hEJywgJy9HbG9zc2FyeS9FL0VWUF9YRC5o dG1sJywNCidGUkVRJywgJy9HbG9zc2FyeS9DL0NQVV9GcmVxdWVuY3kuaHRtbCcs DQonRlNCJywgJy9HbG9zc2FyeS9GL0Zyb250X1NpZGVfQnVzXyhGU0IpLmh0bWwn LA0KJ0hUUkFOU1BPUlQnLCAnL0dsb3NzYXJ5L0gvSHlwZXJUcmFuc3BvcnRfdGVj aG5vbG9neS5odG1sJywNCidIVFQnLCAnL0dsb3NzYXJ5L0gvSHlwZXItVGhyZWFk aW5nX3RlY2hub2xvZ3kuaHRtbCcsDQonSURBJywgJy9HbG9zc2FyeS9EL0R5bmFt aWNfQWNjZWxlcmF0aW9uX3RlY2hub2xvZ3kuaHRtbCcsDQonSU5ERVBfRFlOX0NP UkUnLCAnL0dsb3NzYXJ5L0kvSW5kZXBlbmRlbnRfZHluYW1pY19jb3JlX3RlY2hu b2xvZ3kuaHRtbCcsDQonTDEnLCAnL0dsb3NzYXJ5L0wvTGV2ZWxfMV9jYWNoZS5o dG1sJywNCidMMicsICcvR2xvc3NhcnkvTC9MZXZlbF8yX2NhY2hlLmh0bWwnLA0K J01JTl9NQVhfUE9XRVInLCAnL0dsb3NzYXJ5L00vTWluaW11bV9NYXhpbXVtX3Bv d2VyX2Rpc3NpcGF0aW9uLmh0bWwnLA0KJ01JTl9NQVhfVEVNUCcsICcvR2xvc3Nh cnkvTS9NaW5pbXVtX01heGltdW1fb3BlcmF0aW5nX3RlbXBlcmF0dXJlcy5odG1s JywNCidNT0RFTE4nLCAnL0dsb3NzYXJ5L1AvUHJvY2Vzc29yX01vZGVsX251bWJl ci5odG1sJywNCidTTEVFUF9NT0RFJywgJy9HbG9zc2FyeS9TL1NsZWVwX3N0YXRl Lmh0bWwnLA0KJ1NTRTQnLCAnL0dsb3NzYXJ5L1MvU1NFNC5odG1sJywNCidTU0U0 MScsICcvR2xvc3NhcnkvUy9TU0U0LjEuaHRtbCcsDQonU1NFNDInLCAnL0dsb3Nz YXJ5L1MvU1NFNC4yLmh0bWwnLA0KJ1NTRTRBJywgJy9HbG9zc2FyeS9TL1NTRTRh Lmh0bWwnLA0KJ1NTUEVDJywgJy9HbG9zc2FyeS9TL1NwZWNpZmljYXRpb25fKFMt U3BlYylfbnVtYmVyLmh0bWwnLA0KJ1NTVEVQJywgJy9HbG9zc2FyeS9TL1NwZWVk U3RlcF90ZWNobm9sb2d5Lmh0bWwnLA0KJ1NUT1BfR1JBTlRfTU9ERScsICcvR2xv c3NhcnkvUy9TdG9wX0dyYW50X3N0YXRlLmh0bWwnLA0KJ1REUCcsICcvR2xvc3Nh cnkvVC9UaGVybWFsX0Rlc2lnbl9Qb3dlcl8oVERQKS5odG1sJywNCidUQlQnLCAn L0dsb3NzYXJ5L1QvVHVyYm9fQm9vc3RfVGVjaG5vbG9neS5odG1sJywNCidWQ09S RScsICcvR2xvc3NhcnkvQy9Db3JlX3ZvbHRhZ2UuaHRtbCcsDQonVlQnLCAnL0ds b3NzYXJ5L1YvVmlydHVhbGl6YXRpb25fVGVjaG5vbG9neS5odG1sJywNCidiY18o XFxkKylfKFxcZCspJywgJ2phdmFzY3JpcHQ6Q1dfQUpBWE9uKGV2ZW50LCAiL2Nn aS1iaW4vYWpheC9iZW5jaF9wYXJ0cy5wbD9zPWJjX2luZm8mYW1wO3A9JDEmYW1w O21vPSQyIiw1MDAsNDAwKScsDQonY2NfKFxcZCspJywgJ2phdmFzY3JpcHQ6Q1df QUpBWE9uKGV2ZW50LCAiL2NnaS1iaW4vYWpheC9iZW5jaF9wYXJ0cy5wbD9zPWNj X2luZm8mYW1wO3A9JDEiLDM1MCw0MDApJw0KKTsNCg0KdmFyIExfdGV4dDJMaW5r ID0gbmV3IE9iamVjdDsNCnZhciBMX2R5bl9saW5rcyA9IG5ldyBBcnJheSAoKTsN Cg0KZnVuY3Rpb24gTF9maW5kTGlua3MgKCkNCnsNCg0KCS8vIENvcHkgYWxsIGRh dGEgdG8gYXNzb2NpYXRpdmUgYXJyYXkNCgl2YXIgbGVuID0gTF9hbGxMaW5rcy5s ZW5ndGg7DQoJdmFyIHM7DQoJZm9yICh2YXIgaSA9IDA7IGkgPCBMX2FsbExpbmtz Lmxlbmd0aDsgaSArPSAyKQ0KCXsNCgkJcyA9IExfYWxsTGlua3NbaV07DQoJCWlm CShzLm1hdGNoKC9cKC8pKQ0KCQkJTF9keW5fbGlua3MucHVzaCAobmV3IFJlZ0V4 cCgnXicgKyBzICsgJyQnKSwgTF9hbGxMaW5rc1tpICsgMV0pOw0KCQllbHNlDQoJ CQlMX3RleHQyTGlua1tzXSA9IExfYWxsTGlua3NbaSArIDFdOw0KCX0NCgkvLyBM b29wIHRocm91Z2ggYWxsIERJViBhbmQgU1BBTiB0YWdzIG9uIHRoZSBwYWdlDQoJ TF9fcHJvY2Vzc0VsZW1lbnRzICgnRElWJyk7DQoJTF9fcHJvY2Vzc0VsZW1lbnRz ICgnU1BBTicpOw0KCS8vIEZyZWUgc29tZSBtZW1vcnkNCglMX3RleHQyTGluayA9 IG51bGw7DQoNCglpZgkod2luZG93Lm9ubG9hZF9nc2xfc2F2ZWQpDQoJCXdpbmRv dy5vbmxvYWRfZ3NsX3NhdmVkKCk7DQp9DQoNCmZ1bmN0aW9uIExfX3Byb2Nlc3NF bGVtZW50cyAocF90eXBlKQ0Kew0KDQoJdmFyIGFycmF5ID0gZG9jdW1lbnQuZ2V0 RWxlbWVudHNCeVRhZ05hbWUocF90eXBlKTsNCglpZgkoYXJyYXkgPT0gbnVsbCkJ cmV0dXJuOw0KCXZhciBjbCwgb25lX2VsLCB0ZXh0LCB1cmwsIGosIHJlOw0KCXZh ciBsZW4gPSBhcnJheS5sZW5ndGg7DQoJdmFyIGR5bl9sZW4gPSBMX2R5bl9saW5r cy5sZW5ndGg7DQoJdmFyIHByZWZpeCA9IChMX3VybFByZWZpeCA9PSBudWxsKT8g Jyc6IExfdXJsUHJlZml4Ow0KCWZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKysp DQoJew0KCQlvbmVfZWwgPSBhcnJheVtpXTsNCgkJY2wgPSBvbmVfZWwuY2xhc3NO YW1lOw0KCQlpZgkoIWNsLm1hdGNoKC9eX2xpbmsoXHMrfCQpLykpCWNvbnRpbnVl Ow0KCQl0ZXh0ID0gY2wucmVwbGFjZSgvXl9saW5rXHMqLywgJycpOw0KCQl0ZXh0 ID0gdGV4dC5yZXBsYWNlKC9eW15cc19dXFMrXHMqLywgJycpOw0KCQlpZgkoIXRl eHQubWF0Y2goL15fLykpDQoJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFMrXHMq LywgJycpOw0KCQlpZgkodGV4dCkNCgkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoL15f LywgJycpOw0KCQllbHNlDQoJCXsNCgkJCXRleHQgPSBvbmVfZWwuaW5uZXJIVE1M LnJlcGxhY2UoLzxbXj5dKz4vZywgJycpOw0KCQkJdGV4dCA9IHRleHQucmVwbGFj ZSgvJm5ic3A7L2csICcnKTsNCgkJfQ0KCQl1cmwgPSBMX3RleHQyTGlua1t0ZXh0 XTsNCgkJaWYJKHVybCA9PSBudWxsKQ0KCQl7DQoJCQkvLyBNYXRjaCBkeW5hbWlj IGxpbmtzDQoJCQlmb3IgKGogPSAwOyBqIDwgZHluX2xlbjsgaiArPSAyKQ0KCQkJ ew0KCQkJCXJlID0gTF9keW5fbGlua3Nbal07DQoJCQkJaWYJKHRleHQubWF0Y2gg KHJlKSkNCgkJCQl7DQoJCQkJCXVybCA9IHRleHQucmVwbGFjZShyZSwgTF9keW5f bGlua3NbaiArIDFdKTsNCgkJCQkJYnJlYWs7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJ CWlmCSh1cmwgPT0gbnVsbCkJY29udGludWU7DQoJCW9uZV9lbC5pbm5lckhUTUwg PSAodXJsLm1hdGNoKC9eamF2YXNjcmlwdDovKSk/DQoJCQkiPGEgaHJlZj0nIycg b25DbGljaz0nIiArIHVybCArICI7IHJldHVybiBmYWxzZSc+IiArIG9uZV9lbC5p bm5lckhUTUwgKyAnPC9hPic6DQoJCQkiPGEgaHJlZj0nIiArIHByZWZpeCArIHVy bCArICInIHRhcmdldD0nX2JsYW5rJz4iICsgb25lX2VsLmlubmVySFRNTCArICc8 L2E+JzsNCgl9DQp9DQoNClNldE9ubG9hZChMX2ZpbmRMaW5rcyk7DQoNCi8vDQov LwlUYWJzIC0gYmFzZWQgb24gaHR0cDovL2FrcmFiYXQuY29tL2R5bmFtaWMtamF2 YXNjcmlwdC10YWJzLw0KLy8NCmZ1bmN0aW9uIGdldENoaWxkcmVuQnlDbGFzcyhw X3BhcmVudCwgcF9jbGFzcykNCnsNCgl2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCk7 DQoJdmFyIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCJcXGIiICsgcF9jbGFzcyArICJc XGIiKTsNCg0KCXZhciBlbHMgPSBwX3BhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFt ZSgnKicpOw0KCWZvcgkodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKQ0K CXsNCgkJaWYJKGVsc1tpXS5jbGFzc05hbWUuc2VhcmNoKHBhdHRlcm4pICE9IC0x KQ0KCQkJcmVzdWx0LnB1c2goZWxzW2ldKTsNCgl9DQoJcmV0dXJuIHJlc3VsdDsN Cn0NCg0KZnVuY3Rpb24gVGFic0J1aWxkKHBfaWQsIHBfbikNCnsNCgl2YXIgaSwg dGgsIHRpdGxlLCB0YWJFbGVtZW50LCBsaSwgdGFiTGluazsNCg0KCS8vIGFzc3Vt ZSB0aGF0IGlmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIGV4aXN0cywgdGhlbiB0 aGlzIHdpbGwgd29yay4uLg0KCWlmKCEgZXZhbCgnZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQnKSApIHJldHVybjsNCg0KCXZhciB0YWJDb250YWluZXIgPSBkb2N1bWVu dC5nZXRFbGVtZW50QnlJZChwX2lkKTsNCglpZgkodGFiQ29udGFpbmVyID09IG51 bGwpCXJldHVybjsNCg0KCXZhciB0YWJDb250ZW50cyA9IGdldENoaWxkcmVuQnlD bGFzcyh0YWJDb250YWluZXIsICd0YWItY29udGVudCcpOw0KCWlmKHRhYkNvbnRl bnRzLmxlbmd0aCA9PSAwKQ0KCQlyZXR1cm47DQoJdmFyIGRpdiA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoImRpdiIpOw0KCWRpdi5jbGFzc05hbWUgPSAndGFiLWhl YWRlcic7DQoJZGl2LmlkID0gcF9pZCArICctaGVhZGVyJzsNCgl2YXIgdWwgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOw0KCXVsLmNsYXNzTmFtZSA9ICd0 YWItbGlzdCc7DQoNCgl0YWJDb250YWluZXIuaW5zZXJ0QmVmb3JlKGRpdiwgdGFi Q29udGVudHNbMF0pOw0KCWRpdi5hcHBlbmRDaGlsZCh1bCk7DQoNCglmb3IoaSA9 IDA7IGkgPCB0YWJDb250ZW50cy5sZW5ndGg7IGkrKykNCgl7DQoJCXRoID0gZ2V0 Q2hpbGRyZW5CeUNsYXNzKHRhYkNvbnRlbnRzW2ldLCAndGFiJyk7DQoJCWlmCSh0 aCA9PSBudWxsKQljb250aW51ZTsNCi8vCQl0aXRsZSA9IHRoWzBdLmNoaWxkTm9k ZXNbMF0ubm9kZVZhbHVlOw0KCQl0aXRsZSA9IHRoWzBdLmlubmVySFRNTDsNCgkJ dGl0bGUgPSB0aXRsZS5yZXBsYWNlICgvPFtePl0qPi9nLCAnJyk7DQoNCgkJLy8g Y3JlYXRlIHRoZSB0YWJzIGFzIGFuIHVuc2lnbmVkIGxpc3QNCgkJbGkgPSBkb2N1 bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpOw0KCQlsaS5pZCA9IHBfaWQgKyAnLXRh Yi0nICsgaTsNCgkJdWwuYXBwZW5kQ2hpbGQobGkpOw0KDQoJCXRhYkxpbmsgPSBk b2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7DQoJCXRhYkxpbmsuY2xhc3NOYW1l ID0gInRhYi1pdGVtIjsNCgkJdGFiTGluay5zZXRBdHRyaWJ1dGUoImhyZWYiLCJq YXZhc2NyaXB0Oi8vIik7DQoJCXRhYkxpbmsuc2V0QXR0cmlidXRlKCAidGl0bGUi LCB0aFswXS5nZXRBdHRyaWJ1dGUoInRpdGxlIikpOw0KCQl0YWJMaW5rLm9uY2xp Y2sgPSBuZXcgRnVuY3Rpb24gKCJUYWJzQWN0aXZhdGUoJyIgKyBwX2lkICsgIics ICIgKyBpICsgIikiKTsNCg0KCQlsaS5hcHBlbmRDaGlsZCh0YWJMaW5rKTsNCgkJ dGFiTGluay5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aXRs ZSkpOw0KDQoJCXRoWzBdLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJfQ0KDQoJ VGFic0FjdGl2YXRlIChwX2lkLCBwX24pOw0KfQ0KDQpmdW5jdGlvbiBUYWJzQWN0 aXZhdGUocF9pZCwgYWN0aXZlVGFiSW5kZXgpDQp7DQoJdmFyIHRhYkNvbnRhaW5l ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBfaWQpOw0KCWlmCSh0YWJDb250 YWluZXIgPT0gbnVsbCkJcmV0dXJuOw0KDQoJdmFyIHRhYkNvbnRlbnRzID0gZ2V0 Q2hpbGRyZW5CeUNsYXNzKHRhYkNvbnRhaW5lciwgJ3RhYi1jb250ZW50Jyk7DQoJ aWYodGFiQ29udGVudHMubGVuZ3RoID09IDApCXJldHVybjsNCgl2YXIgaTsNCglm b3IoaSA9IDA7IGkgPCB0YWJDb250ZW50cy5sZW5ndGg7IGkrKykNCgkJdGFiQ29u dGVudHNbaV0uc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCg0KCXRhYkNvbnRlbnRz W2FjdGl2ZVRhYkluZGV4XS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsNCg0KCXRh Ykxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwX2lkICsgJy1saXN0Jyk7 DQoJdGFicyA9IGdldENoaWxkcmVuQnlDbGFzcyh0YWJDb250YWluZXIsICd0YWIt aXRlbScpOw0KCWlmKHRhYnMubGVuZ3RoID4gMCkNCgl7DQoJCWZvcihpID0gMDsg aSA8IHRhYnMubGVuZ3RoOyBpKyspDQoJCQl0YWJzW2ldLmNsYXNzTmFtZSA9ICJ0 YWItaXRlbSI7DQoNCgkJdGFic1thY3RpdmVUYWJJbmRleF0uY2xhc3NOYW1lID0g InRhYi1pdGVtIHRhYi1hY3RpdmUiOw0KCQl0YWJzW2FjdGl2ZVRhYkluZGV4XS5i bHVyKCk7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBUYWJzSW5pdCAoKSB7CVRhYnNCdWls ZCgndGFiLWNvbnRhaW5lcicsIDApOyB9DQoNClNldE9ubG9hZCAoVGFic0luaXQp Ow0KaWYJKGRvY3VtZW50LmN3X3NldHVwX2ZpbHRlcikJU2V0T25sb2FkKFNldHVw RmlsdGVyKTsNCg0KLy8gY3B1X3dvcmxkX2FqYXguanMNCg0KdmFyIENXX2llNCA9 IChkb2N1bWVudC5hbGwpPyAxOiAwOw0KdmFyIENXX29wYSA9ICgoQ1dfaWU0KSYm KG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignT3BlcmEnKSAhPSAtMSkpPyAx OiAwOw0KdmFyIENXX2ZmeCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCk/IDE6 IDA7DQp2YXIgQ1dfbnM0ID0gKGRvY3VtZW50LmxheWVycyk/IDE6IDA7DQp2YXIg Q1dfbnM2ID0gKChDV19mZngpJiYoIWRvY3VtZW50LmFsbCkpPyAxOiAwOw0KDQp2 YXIgQ1dfdGltZXJfaWQ7DQp2YXIgQ1dfdGltZXJfb24gPSAwOw0KdmFyIENXX0FK QVhfdXJsOw0KdmFyIENXX0FKQVhfcGFyYW1zID0gJyc7DQp2YXIgQ1dfQUpBWF9w YXJhbXMyID0gJyc7DQp2YXIgQ1dfZGl2X3cgPSAnJzsNCnZhciBDV19kaXZfaCA9 ICcnOw0KdmFyIENXX2Rpdl92aXNpYmxlID0gMDsNCnZhciBDV19kaXZfaW5pdGlh bGl6ZWQgPSAwOw0KdmFyIENXX2Rpdl9pZDsNCnZhciBDV19zaG93X2RlbGF5ID0g MTAwMDsNCnZhciBDV19kaXZfb25sb2FkID0gMDsNCg0KZnVuY3Rpb24gQ1dfRGl2 U2hvdyAocF9ldmVudCwgcF9kaXYsIHBfeG9mZiwgcF95b2ZmKQ0Kew0KCUNXX0Rp dlBvc2l0aW9uIChwX2V2ZW50LCBwX2RpdiwgcF94b2ZmLCBwX3lvZmYpOw0KCUNX X0Rpdk1ha2VWaXNpYmxlIChwX2Rpdik7DQp9DQoNCmZ1bmN0aW9uIENXX0Rpdkhp ZGUgKHBfZGl2KQ0Kew0KCXZhciBvYmo7DQoNCglpZiAoQ1dfZmZ4KQ0KCXsNCgkJ b2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocF9kaXYpOw0KCQlpZgkob2Jq ICE9IG51bGwpDQoJCQlvYmouc3R5bGUuZGlzcGxheSA9ICJub25lIjsNCgkJcmV0 dXJuOw0KCX0NCglpZiAoQ1dfaWU0KQ0KCXsNCgkJb2JqID0gZG9jdW1lbnQuYWxs W3BfZGl2XTsNCgkJaWYJKG9iaiAhPSBudWxsKQ0KCQkJb2JqLnN0eWxlLnZpc2li aWxpdHkgPSAiaGlkZGVuIjsNCgkJcmV0dXJuOw0KCX0NCglpZiAoQ1dfbnM0KQ0K CXsNCgkJb2JqID0gZG9jdW1lbnQubGF5ZXJzW3BfZGl2XTsNCgkJaWYJKG9iaiAh PSBudWxsKQ0KCQkJb2JqLnZpc2liaWxpdHkgPSAiaGlkZSI7DQoJfQ0KfQ0KDQpm dW5jdGlvbiBDV19EaXZQb3NpdGlvbihwX2V2ZW50LCBwX2RpdiwgcF94b2ZmLCBw X3lvZmYsIHBfYWRqdXN0KQ0Kew0KCXZhciBwb3N4Ow0KCXZhciBwb3N5Ow0KDQoJ dmFyIGNvb3JkcyA9IG5ldyBPYmplY3QoKTsNCglDV19Nb3VzZVhZIChwX2V2ZW50 LCBjb29yZHMpOw0KCXZhciBwb3N4ID0gY29vcmRzLng7DQoJdmFyIHBvc3kgPSBj b29yZHMueTsNCg0KCWlmCShwX3hvZmYgIT0gbnVsbCkgcG9zeCArPSBwX3hvZmY7 DQoJaWYJKHBfeW9mZiAhPSBudWxsKSBwb3N5ICs9IHBfeW9mZjsNCg0KCXZhciBv Ymo7DQoJaWYgKENXX25zNCkNCgl7DQoJCW9iaiA9IGRvY3VtZW50LmxheWVyc1tw X2Rpdl07DQoJCW9iai50b3AgPSBwb3N5Ow0KCQlvYmoubGVmdCA9IHBvc3g7DQoJ fQ0KCWVsc2UNCgl7DQoJCS8vIERvIHNvbWV0aGluZyB3aXRoIHRoaXMgaW5mb3Jt YXRpb24NCgkJaWYgKChDV19mZngpfHwoIUNXX2llNCkpDQoJCXsNCgkJCW9iaiA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBfZGl2KTsNCgkJfQ0KCQllbHNlDQoJ CXsNCgkJCW9iaiA9IGRvY3VtZW50LmFsbFtwX2Rpdl07DQoJCX0NCgkJdmFyIG9i al9wYXJlbnQgPSBvYmoub2Zmc2V0UGFyZW50Ow0KCQl3aGlsZSAob2JqX3BhcmVu dCAhPSBudWxsKQ0KCQl7DQoJCQlwb3N4IC09IG9ial9wYXJlbnQub2Zmc2V0TGVm dDsNCgkJCXBvc3kgLT0gb2JqX3BhcmVudC5vZmZzZXRUb3A7DQoJCQlvYmpfcGFy ZW50ID0gb2JqX3BhcmVudC5vZmZzZXRQYXJlbnQ7DQoJCX0NCg0KCQkvLyBBZGp1 c3QgcG9zaXRpb24gc28gaXQgZG9lc24ndCBnbyBvdXRzaWRlIG9mIHRoZSBzY3Jl ZW4NCgkJaWYJKHBfYWRqdXN0KQ0KCQl7DQoJCQl2YXIgbWF4dyA9IChkb2N1bWVu dC5ib2R5LmNsaWVudFdpZHRoIHx8DQoJCQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50LmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoKSAtDQoJCQkJb2Jq Lm9mZnNldFdpZHRoIC0gNSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsNCgkJ CXZhciBtYXh5ID0gKGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0IHx8DQoJCQkJ ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fCB3aW5kb3cu aW5uZXJIZWlnaHQpIC0NCgkJCQk1ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A7 DQoJCQl2YXIgbWF4aCA9IG1heHkgLSBvYmoub2Zmc2V0SGVpZ2h0Ow0KCQkJaWYJ KHBfYWRqdXN0ID09IDEpDQoJCQl7DQoJCQkJaWYJKHBvc3ggPiBtYXh3KQlwb3N4 ID0gbWF4dzsNCgkJCQlpZgkocG9zeCA8IDApCXBvc3ggPSAwOw0KCQkJCWlmCShw b3N5ID4gbWF4aCkJcG9zeSA9IG1heGg7DQoJCQkJaWYJKHBvc3kgPCAwKQlwb3N5 ID0gMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQl2YXIgaSA9IG1heHkgLSBw b3N5IC0gMTsNCgkJCQlpZgkoKGkgPiAwKSYmKGkgPCBvYmoub2Zmc2V0SGVpZ2h0 KSkNCgkJCQl7DQoJCQkJCWlmCShpIDwgMjApCWkgPSAyMDsNCgkJCQkJb2JqLnN0 eWxlLmhlaWdodCA9IGkgKyAncHgnOw0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCW9i ai5zdHlsZS50b3AgPSBwb3N5ICsgJ3B4JzsNCgkJb2JqLnN0eWxlLmxlZnQgPSBw b3N4ICsgJ3B4JzsNCgl9DQp9DQoNCmZ1bmN0aW9uIENXX01vdXNlWFkgKHBfZXZl bnQsIHBfY29vcmQpDQp7DQoJdmFyIHBvc3gsIHBvc3k7DQoNCglpZgkoKHBfZXZl bnQgPT0gbnVsbCl8fCghcF9ldmVudCkpDQoJew0KCQlwb3N4ID0gMDsNCgkJcG9z eSA9IDA7DQoJfQ0KCWVsc2UgaWYJKCghQ1dfaWU0KSYmKChwX2V2ZW50LnBhZ2VY KXx8KHBfZXZlbnQucGFnZVkpKSkNCgl7DQoJCXBvc3ggPSBwX2V2ZW50LnBhZ2VY Ow0KCQlwb3N5ID0gcF9ldmVudC5wYWdlWTsNCgl9DQoJZWxzZQ0KCXsNCgkJaWYg KENXX25zNCB8fCBDV19uczYpDQoJCXsNCgkJCXBvc3ggPSBwX2V2ZW50LmNsaWVu dFggKyB3aW5kb3cuc2Nyb2xsWDsNCgkJCXBvc3kgPSBwX2V2ZW50LmNsaWVudFkg KyB3aW5kb3cuc2Nyb2xsWTsNCgkJfQ0KCQllbHNlIGlmIChDV19vcGEpDQoJCXsN CgkJCXBvc3ggPSB3aW5kb3cuZXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudC5zY3JvbGxMZWZ0Ow0KCQkJcG9zeSA9IHdpbmRvdy5ldmVudC5j bGllbnRZICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCgkJ fQ0KCQllbHNlDQoJCXsNCgkJCXBvc3ggPSB3aW5kb3cuZXZlbnQuY2xpZW50WCAr IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0ICsNCgkJCQlkb2N1 bWVudC5ib2R5LnNjcm9sbExlZnQ7DQoJCQlwb3N5ID0gd2luZG93LmV2ZW50LmNs aWVudFkgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wICsNCgkJ CQlkb2N1bWVudC5ib2R5LnNjcm9sbFRvcDsNCgkJfQ0KCX0NCg0KCXBfY29vcmQu eCA9IHBvc3g7DQoJcF9jb29yZC55ID0gcG9zeTsNCn0NCg0KZnVuY3Rpb24gQ1df RGl2TWFrZVZpc2libGUocF9kaXYpDQp7DQoNCgl2YXIgb2JqOw0KCWlmIChDV19u czQpDQoJew0KCQlvYmogPSBkb2N1bWVudC5sYXllcnNbcF9kaXZdOw0KCQlvYmou dmlzaWJpbGl0eSA9ICJzaG93IjsNCgl9DQoJZWxzZQ0KCXsNCgkJLy8gRG8gc29t ZXRoaW5nIHdpdGggdGhpcyBpbmZvcm1hdGlvbg0KCQlpZiAoKENXX2ZmeCl8fCgh Q1dfaWU0KSkNCgkJew0KCQkJb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo cF9kaXYpOw0KCQkJb2JqLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOw0KCQl9DQoJ CWVsc2UNCgkJew0KCQkJb2JqID0gZG9jdW1lbnQuYWxsW3BfZGl2XTsNCgkJCW9i ai5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOw0KCQl9DQoJfQ0KfQ0KDQpm dW5jdGlvbiBDV19EaXZJbml0aWFsaXplKHBfZGl2LCBwX3VybCwgcF9wYXJhbXMs IHBfZGVsYXkpDQp7DQoJQ1dfZGl2X2lkID0gcF9kaXY7DQoJQ1dfQUpBWF91cmwg PSBwX3VybDsNCglDV19BSkFYX3BhcmFtcyA9IHBfcGFyYW1zOw0KCWlmCShwX2Rl bGF5ICE9IG51bGwpDQoJCUNXX3Nob3dfZGVsYXkgPSBwX2RlbGF5Ow0KCWlmCShD V19kaXZfaWQpDQoJew0KCQlDV19kaXZfaW5pdGlhbGl6ZWQgPSAxOw0KCQlkb2N1 bWVudC5vbm1vdXNlbW92ZSA9IENXX19EaXZNb3ZlQ3Vyc29yOw0KCX0NCglpZgko Q1dfZGl2X29ubG9hZCkNCgkJQ1dfX0RpdlVwKCk7DQp9DQoNCmZ1bmN0aW9uIENX X19EaXZVcCAoKQ0Kew0KCWlmCShDV19kaXZfaWQgPT0gbnVsbCkNCgkJcmV0dXJu Ow0KDQoJLy8gTWFrZSBwX2RpdiBhIGNoaWxkIG9mIHRoZSBtYWluIGRvY3VtZW50 DQoJdmFyIG9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKENXX2Rpdl9pZCk7 DQoJaWYJKChvYmogIT0gbnVsbCkmJihvYmoucGFyZW50Tm9kZSAhPSBudWxsKSYm KGRvY3VtZW50LmJvZHkpKQ0KCXsNCgkJdmFyIG9ial9wYXJlbnQgPSBvYmoucGFy ZW50Tm9kZTsNCgkJaWYJKG9ial9wYXJlbnQgIT0gZG9jdW1lbnQuYm9keSkNCgkJ ew0KCQkJb2JqX3BhcmVudC5yZW1vdmVDaGlsZChvYmopOw0KCQkJZG9jdW1lbnQu Ym9keS5hcHBlbmRDaGlsZChvYmopOw0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBD V19EaXZPbmxvYWQgKCkNCnsNCglDV19kaXZfb25sb2FkID0gMTsNCglpZgkoQ1df ZGl2X2lkICE9IG51bGwpDQoJCUNXX19EaXZVcCgpOw0KDQoJaWYJKHdpbmRvdy5v bmxvYWRfQ1dfZGl2X3NhdmVkKQ0KCQl3aW5kb3cub25sb2FkX0NXX2Rpdl9zYXZl ZCgpOw0KfQ0KDQpmdW5jdGlvbiBDV19UaW1lck9uIChwX2V2ZW50LCBwX3BhcmFt cywgcF93LCBwX2gsIHBfZGVsYXkpDQp7DQoJaWYJKENXX2Rpdl9pbml0aWFsaXpl ZCA9PSAwKQ0KCXsNCgkJQ1dfQ3JlYXRlT25EaXYocF9wYXJhbXMpOw0KCQlkb2N1 bWVudC5vbm1vdXNlbW92ZSA9IENXX19EaXZNb3ZlQ3Vyc29yOw0KCX0NCgllbHNl DQoJCUNXX0FKQVhfcGFyYW1zMiA9IChwX3BhcmFtcyA9PSBudWxsKT8gJyc6IHBf cGFyYW1zOw0KCWlmCShDV190aW1lcl9vbikNCgkJY2xlYXJUaW1lb3V0KENXX3Rp bWVyX2lkKTsNCglpZgkocF9kZWxheSA9PSBudWxsKQlwX2RlbGF5ID0gQ1dfc2hv d19kZWxheTsNCglDV19kaXZfdyA9IChwX3cgPT0gbnVsbCk/IDA6IHBfdzsNCglD V19kaXZfaCA9IChwX2ggPT0gbnVsbCk/IDA6IHBfaDsNCglDV190aW1lcl9pZCA9 IHNldFRpbWVvdXQoJ0NXX0RpdlRpbWVyKCknLCBwX2RlbGF5KTsNCglDV19EaXZQ b3NpdGlvbihwX2V2ZW50LCBDV19kaXZfaWQsIDEwLCAxMCk7DQoJQ1dfdGltZXJf b24gPSAxOw0KfQ0KDQpmdW5jdGlvbiBDV19BSkFYT24gKHBfZXZlbnQsIHBfcGFy YW1zLCBwX3csIHBfaCkNCnsNCglpZgkoQ1dfZGl2X2luaXRpYWxpemVkID09IDAp DQoJCUNXX0NyZWF0ZU9uRGl2KHBfcGFyYW1zKTsNCgllbHNlDQoJCUNXX0FKQVhf cGFyYW1zMiA9IChwX3BhcmFtcyA9PSBudWxsKT8gJyc6IHBfcGFyYW1zOw0KCWlm CShDV190aW1lcl9vbikNCgl7DQoJCWNsZWFyVGltZW91dChDV190aW1lcl9pZCk7 DQoJCUNXX3RpbWVyX29uID0gMDsNCgl9DQoJQ1dfZGl2X3cgPSAocF93ID09IG51 bGwpPyAwOiBwX3c7DQoJQ1dfZGl2X2ggPSAocF9oID09IG51bGwpPyAwOiBwX2g7 DQoJQ1dfRGl2UG9zaXRpb24ocF9ldmVudCwgQ1dfZGl2X2lkLCAxMCwgMTApOw0K CUNXX0RpdlRpbWVyKCk7DQp9DQoNCmZ1bmN0aW9uIENXX0pTRnVuY3Rpb25PbiAo cF9ldmVudCwgcF93LCBwX2gsIHBfZnVuY3Rpb24pDQp7DQoJaWYJKENXX2Rpdl9p bml0aWFsaXplZCA9PSAwKQ0KCQlDV19DcmVhdGVPbkRpdignJyk7DQoJaWYJKENX X3RpbWVyX29uKQ0KCXsNCgkJY2xlYXJUaW1lb3V0KENXX3RpbWVyX2lkKTsNCgkJ Q1dfdGltZXJfb24gPSAwOw0KCX0NCgl2YXIgcHdfZGl2ID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQoQ1dfZGl2X2lkKTsNCglpZgkocHdfZGl2ID09IG51bGwpCXJl dHVybjsNCglpZgkoKHBfdyAhPSBudWxsKSYmKHBfdyAhPSAwKSkNCgkJcHdfZGl2 LnN0eWxlLndpZHRoID0gcF93Ow0KCWlmCSgocF9oICE9IG51bGwpJiYocF9oICE9 IDApKQ0KCQlwd19kaXYuc3R5bGUuaGVpZ2h0ID0gcF9oOw0KDQoJdmFyIGxlbiA9 IGFyZ3VtZW50cy5sZW5ndGg7DQoJdmFyIGZfYXJncyA9IG5ldyBBcnJheSAoKTsN Cgl2YXIgaTsNCglmb3IgKGkgPSA0OyBpIDwgbGVuOyBpKyspDQoJCWZfYXJncy5w dXNoIChhcmd1bWVudHNbaV0pOw0KCXB3X2Rpdi5pbm5lckhUTUwgPSBwX2Z1bmN0 aW9uIChmX2FyZ3MpOw0KCUNXX0Rpdk1ha2VWaXNpYmxlKENXX2Rpdl9pZCk7DQoJ Q1dfRGl2UG9zaXRpb24ocF9ldmVudCwgQ1dfZGl2X2lkLCAxMCwgMTAsIDEpOw0K CUNXX2Rpdl92aXNpYmxlID0gMTsNCn0NCg0KZnVuY3Rpb24gQ1dfQ3JlYXRlT25E aXYgKHBfcGFyYW1zKQ0Kew0KDQoJdmFyIGN3X2RpdiA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkICgnQ1dfRElWJyk7DQoJaWYJKGN3X2RpdiA9PSBudWxsKQ0KCXsN CgkJY3dfZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQoJCWN3 X2Rpdi5pZCA9ICdDV19ESVYnOw0KCQljd19kaXYuekluZGV4ID0gMTA7DQoJCWN3 X2Rpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7DQoJCWN3X2Rpdi5zdHls ZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQljd19kaXYuc3R5bGUuaGVpZ2h0ID0gJ2F1 dG8nOw0KCQljd19kaXYuc3R5bGUub3ZlcmZsb3cgPSAnYXV0byc7DQoJCWRvY3Vt ZW50LmJvZHkuYXBwZW5kQ2hpbGQoY3dfZGl2KTsNCgl9DQoJZWxzZQ0KCXsNCgkJ Ly8gSGlkZSBESVYgaWYgaXQncyB2aXNpYmxlDQoJCWlmCShjd19kaXYuc3R5bGUu ZGlzcGxheSAhPSAnbm9uZScpDQoJCQljd19kaXYuc3R5bGUuZGlzcGxheSA9ICdu b25lJzsNCgl9DQoJQ1dfZGl2X2lkID0gJ0NXX0RJVic7DQoJdmFyIGEgPSBwX3Bh cmFtcy5zcGxpdCgvXD8vLCAyKTsNCglDV19BSkFYX3VybCA9IGFbMF07DQoJQ1df QUpBWF9wYXJhbXMgPSAoYS5sZW5ndGggPiAxKT8gYVsxXTogJyc7DQoJQ1dfQUpB WF9wYXJhbXMyID0gJyc7DQp9DQoNCmZ1bmN0aW9uIENXX19EaXZNb3ZlQ3Vyc29y IChwX2V2ZW50KQ0Kew0KCWlmCSghQ1dfdGltZXJfb24pCXJldHVybjsNCglDV19E aXZQb3NpdGlvbihwX2V2ZW50LCBDV19kaXZfaWQsIDEwLCAxMCk7DQp9DQoNCmZ1 bmN0aW9uIENXX1RpbWVyT2ZmICgpDQp7DQoJaWYJKENXX3RpbWVyX29uKQ0KCQlj bGVhclRpbWVvdXQoQ1dfdGltZXJfaWQpOw0KCWlmCShDV19kaXZfdmlzaWJsZSkN Cgl7DQoJCUNXX0RpdkhpZGUgKENXX2Rpdl9pZCk7DQoJCUNXX2Rpdl92aXNpYmxl ID0gMDsNCgl9DQoJQ1dfdGltZXJfb24gPSAwOw0KfQ0KDQpmdW5jdGlvbiBDV19E aXZUaW1lciAoKQ0Kew0KCXZhciBwd19kaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZChDV19kaXZfaWQpOw0KCWlmCShwd19kaXYgPT0gbnVsbCkNCgl7DQoJCUNX X3RpbWVyX29uID0gMDsNCgkJcmV0dXJuOw0KCX0NCg0KCWlmCShDV19BSkFYX3Vy bCAhPSAnJykNCgl7DQoJCXZhciBwYXJhbXMgPSBDV19BSkFYX3BhcmFtczsNCgkJ aWYJKENXX0FKQVhfcGFyYW1zMiAhPSAnJykNCgkJew0KCQkJaWYJKHBhcmFtcyAh PSAnJykJcGFyYW1zICs9ICcmJzsNCgkJCXBhcmFtcyArPSBDV19BSkFYX3BhcmFt czI7DQoJCX0NCgkJbmV3IEFqYXguUmVxdWVzdChDV19BSkFYX3VybCwNCgkJew0K CQkJbWV0aG9kOiAnZ2V0JywNCgkJCXBhcmFtZXRlcnM6IHBhcmFtcywNCgkJCW9u U3VjY2VzczogZnVuY3Rpb24odHJhbnNwb3J0KQ0KCQkJew0KCQkJCXZhciB0ZXh0 ID0gdHJhbnNwb3J0LnJlc3BvbnNlVGV4dCB8fCAnJzsNCgkJCQlpZiAodGV4dCAh PSAnJykNCgkJCQl7DQoJCQkJCXZhciBwd19kaXYgPSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZChDV19kaXZfaWQpOw0KCQkJCQlwd19kaXYuaW5uZXJIVE1MID0gdGV4 dDsNCgkJCQkJQ1dfRGl2TWFrZVZpc2libGUoQ1dfZGl2X2lkKTsNCgkJCQkJQ1df ZGl2X3Zpc2libGUgPSAxOw0KCQkJCX0NCgkJCX0NCgkJfSk7DQoJfQ0KCWVsc2UN Cgl7DQoJCWlmCShDV19kaXZfdykNCgkJCXB3X2Rpdi5zdHlsZS53aWR0aCA9IENX X2Rpdl93Ow0KCQlpZgkoQ1dfZGl2X2gpDQoJCQlwd19kaXYuc3R5bGUuaGVpZ2h0 ID0gQ1dfZGl2X2g7DQoJCXB3X2Rpdi5pbm5lckhUTUwgPSBDV19BSkFYX3BhcmFt cyArIENXX0FKQVhfcGFyYW1zMjsNCgkJQ1dfRGl2TWFrZVZpc2libGUoQ1dfZGl2 X2lkKTsNCgkJQ1dfZGl2X3Zpc2libGUgPSAxOw0KCX0NCg0KCUNXX3RpbWVyX29u ID0gMDsNCn0NCg0KZnVuY3Rpb24JQ1dfQ2FsbEFKQVggKHBfdXJsKQ0Kew0KDQoJ dmFyIHBhcmFtcyA9ICcnOw0KCWlmCShwX3VybC5tYXRjaCgvLlw/Li8pKQ0KCXsN CgkJcGFyYW1zID0gcF91cmwucmVwbGFjZSgvXi4rXD8oLispJC8sICIkMSIpOw0K CQlwX3VybCA9IHBfdXJsLnJlcGxhY2UgKC9eKC4rKVw/LiskLywgIiQxIik7DQoJ fQ0KDQoJbmV3IEFqYXguUmVxdWVzdChwX3VybCwNCgl7DQoJCW1ldGhvZDogJ2dl dCcsDQoJCXBhcmFtZXRlcnM6IHBhcmFtcywNCgkJb25TdWNjZXNzOiBmdW5jdGlv bih0cmFuc3BvcnQpDQoJCXsNCgkJCXZhciB0ZXh0ID0gdHJhbnNwb3J0LnJlc3Bv bnNlVGV4dCB8fCAnJzsNCgkJCWlmICh0ZXh0ICE9ICcnKQ0KCQkJew0KCQkJCXZh ciBpLCBqLCBzLCBvYmo7DQoJCQkJdmFyIGh0bWxfYXJyID0gdGV4dC5zcGxpdCgv XH5cflx+Lyk7DQoJCQkJZm9yIChpID0gMDsgaSA8IGh0bWxfYXJyLmxlbmd0aDsg aSArPSAyKQ0KCQkJCXsNCgkJCQkJcyA9IGh0bWxfYXJyW2ldOw0KCQkJCQlzID0g cy5yZXBsYWNlKC9ccyskLywgJycpOw0KCQkJCQlpZgkocy5tYXRjaCgvXkRJVlxz K1x3KyQvKSkNCgkJCQkJew0KCQkJCQkJcyA9IHMucmVwbGFjZSgvXkRJVlxzKy8s ICcnKTsNCgkJCQkJCW9iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpOw0K CQkJCQkJaWYJKG9iaiAhPSBudWxsKQ0KCQkJCQkJCW9iai5pbm5lckhUTUwgPSAo aHRtbF9hcnJbaSArIDFdID09IG51bGwpPyAnJzogJyAnICsgaHRtbF9hcnJbaSAr IDFdOw0KCQkJCQl9DQoJCQkJCS8vIFNldCB2YWx1ZXMgZm9yIGJsYW5rIGZvcm0g ZmllbGRzIGlmIG5lY2Vzc2FyeQ0KCQkJCQllbHNlIGlmIChzID09ICdTRVQnKQ0K CQkJCQl7DQoJCQkJCQl2YXIga3Y7DQoJCQkJCQl2YXIganNfYXJyID0gaHRtbF9h cnJbaSArIDFdLnNwbGl0KC9ccypcblxzKi8pOw0KCQkJCQkJZm9yIChqID0gMDsg aiA8IGpzX2Fyci5sZW5ndGg7IGorKykNCgkJCQkJCXsNCgkJCQkJCQlpZgkoIWpz X2FycltqXS5tYXRjaCgvPS8pKQljb250aW51ZTsNCgkJCQkJCQlrdiA9IGpzX2Fy cltqXS5zcGxpdCgvXHMqPVxzKi8pOw0KCQkJCQkJCWlmCShrdlsxXSA9PSAnJykJ Y29udGludWU7DQoJCQkJCQkJaWYJKGt2WzFdID09IHVuZGVmaW5lZCkJY29udGlu dWU7DQoJCQkJCQkJb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoa3ZbMF0p Ow0KCQkJCQkJCWlmCSgob2JqICE9IG51bGwpJiYob2JqLnZhbHVlID09ICcnKSkN CgkJCQkJCQl7DQoJCQkJCQkJCW9iai52YWx1ZSA9IGt2WzFdOw0KCQkJCQkJCQlp Zgkob2JqLm9uY2hhbmdlKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQl0cnkgeyBvYmou b25jaGFuZ2UoKSB9IGNhdGNoKGVycikgeyB9Ow0KCQkJCQkJCQl9DQoJCQkJCQkJ fQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJYWxl cnQoIlVucmVjb2duaXplZCBjb21tYW5kICciICsgcyArICInIik7DQoJCQkJCX0N CgkJCQl9DQoJCQl9DQoJCX0NCgl9KTsNCg0KCXJldHVybiBmYWxzZTsNCn0NCg0K ZnVuY3Rpb24JU2Nyb2xsSW50b1ZpZXcgKHBfb2JqKQ0Kew0KDQoJdmFyIHBhcmVu dCA9IHBfb2JqLnBhcmVudE5vZGU7DQoJaWYJKHBhcmVudCA9PSBudWxsKQlyZXR1 cm47DQoJdmFyIHBjaCA9IHBhcmVudC5jbGllbnRIZWlnaHQ7DQoJaWYJKHBjaCA8 IHBhcmVudC5zY3JvbGxIZWlnaHQpDQoJew0KCQl2YXIgeSA9IHBfb2JqLm9mZnNl dFRvcCAtICgocGNoIC0gcF9vYmouY2xpZW50SGVpZ2h0KSAvIDIpOw0KCQlwYXJl bnQuc2Nyb2xsVG9wID0gKHkgPj0gMCk/IHk6IDA7DQoJfQ0KCWlmICgocGFyZW50 LnBhcmVudCkmJihwX29iai5ub2RlVHlwZSAhPSAnQk9EWScpKQ0KCQlTY3JvbGxJ bnRvVmlldyhwYXJlbnQpOw0KfQ0KDQppZgkod2luZG93Lm9ubG9hZCkNCgl3aW5k b3cub25sb2FkX0NXX2Rpdl9zYXZlZCA9IHdpbmRvdy5vbmxvYWQ7DQp3aW5kb3cu b25sb2FkID0gQ1dfRGl2T25sb2FkOw0KDQovKglQcm90b3R5cGUgSmF2YVNjcmlw dCBmcmFtZXdvcmssIHZlcnNpb24gMS40LjBfcHJlMTBfYWpheA0KICoJKGMpIDIw MDUgU2FtIFN0ZXBoZW5zb24gPHNhbUBjb25pby5uZXQ+DQogKg0KICoJVGhpcyBp cyBhIGRvd25jdXQgdmVyc2lvbiBmb3IgQUpBWCBieSBBbGV4YW5kZXIgS2lyayBo dHRwOi8vYWxleGFuZGVyLmtpcmsuYXQvDQogKg0KICoJUHJvdG90eXBlIGlzIGZy ZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiBhbiBNSVQtc3R5 bGUgbGljZW5zZS4NCiAqDQogKglGb3IgZGV0YWlscywgc2VlIHRoZSBQcm90b3R5 cGUgd2ViIHNpdGU6IGh0dHA6Ly9wcm90b3R5cGUuY29uaW8ubmV0Lw0KICoNCi8q LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp2YXIgUHJvdG90eXBlID0g ew0KCVZlcnNpb246ICcxLjQuMF9wcmUxMF9hamF4JywNCgkNCgllbXB0eUZ1bmN0 aW9uOiBmdW5jdGlvbigpIHt9LA0KCUs6IGZ1bmN0aW9uKHgpIHtyZXR1cm4geH0N Cn0NCg0KdmFyIENsYXNzID0gew0KCWNyZWF0ZTogZnVuY3Rpb24oKSB7DQoJCXJl dHVybiBmdW5jdGlvbigpIHsgDQoJCQl0aGlzLmluaXRpYWxpemUuYXBwbHkodGhp cywgYXJndW1lbnRzKTsNCgkJfQ0KCX0NCn0NCg0KdmFyIEFic3RyYWN0ID0gbmV3 IE9iamVjdCgpOw0KDQpPYmplY3QuZXh0ZW5kID0gZnVuY3Rpb24oZGVzdGluYXRp b24sIHNvdXJjZSkgew0KCWZvciAocHJvcGVydHkgaW4gc291cmNlKSB7DQoJCWRl c3RpbmF0aW9uW3Byb3BlcnR5XSA9IHNvdXJjZVtwcm9wZXJ0eV07DQoJfQ0KCXJl dHVybiBkZXN0aW5hdGlvbjsNCn0NCg0KT2JqZWN0Lmluc3BlY3QgPSBmdW5jdGlv bihvYmplY3QpIHsNCgl0cnkgew0KCQlpZiAob2JqZWN0ID09IHVuZGVmaW5lZCkg cmV0dXJuICd1bmRlZmluZWQnOw0KCQlpZiAob2JqZWN0ID09IG51bGwpIHJldHVy biAnbnVsbCc7DQoJCXJldHVybiBvYmplY3QuaW5zcGVjdCA/IG9iamVjdC5pbnNw ZWN0KCkgOiBvYmplY3QudG9TdHJpbmcoKTsNCgl9IGNhdGNoIChlKSB7DQoJCWlm IChlIGluc3RhbmNlb2YgUmFuZ2VFcnJvcikgcmV0dXJuICcuLi4nOw0KCQl0aHJv dyBlOw0KCX0NCn0NCg0KRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgPSBmdW5jdGlv bihvYmplY3QpIHsNCgl2YXIgX19tZXRob2QgPSB0aGlzOw0KCXJldHVybiBmdW5j dGlvbigpIHsNCgkJcmV0dXJuIF9fbWV0aG9kLmFwcGx5KG9iamVjdCwgYXJndW1l bnRzKTsNCgl9DQp9DQoNCkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kQXNFdmVudExp c3RlbmVyID0gZnVuY3Rpb24ob2JqZWN0KSB7DQoJdmFyIF9fbWV0aG9kID0gdGhp czsNCglyZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsNCgkJcmV0dXJuIF9fbWV0aG9k LmNhbGwob2JqZWN0LCBldmVudCB8fCB3aW5kb3cuZXZlbnQpOw0KCX0NCn0NCg0K T2JqZWN0LmV4dGVuZChOdW1iZXIucHJvdG90eXBlLCB7DQoJdG9Db2xvclBhcnQ6 IGZ1bmN0aW9uKCkgew0KCQl2YXIgZGlnaXRzID0gdGhpcy50b1N0cmluZygxNik7 DQoJCWlmICh0aGlzIDwgMTYpIHJldHVybiAnMCcgKyBkaWdpdHM7DQoJCXJldHVy biBkaWdpdHM7DQoJfSwNCg0KCXN1Y2M6IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4g dGhpcyArIDE7DQoJfSwNCgkNCgl0aW1lczogZnVuY3Rpb24oaXRlcmF0b3IpIHsN CgkJJFIoMCwgdGhpcywgdHJ1ZSkuZWFjaChpdGVyYXRvcik7DQoJCXJldHVybiB0 aGlzOw0KCX0NCn0pOw0KDQp2YXIgVHJ5ID0gew0KCXRoZXNlOiBmdW5jdGlvbigp IHsNCgkJdmFyIHJldHVyblZhbHVlOw0KDQoJCWZvciAodmFyIGkgPSAwOyBpIDwg YXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7DQoJCQl2YXIgbGFtYmRhID0gYXJndW1l bnRzW2ldOw0KCQkJdHJ5IHsNCgkJCQlyZXR1cm5WYWx1ZSA9IGxhbWJkYSgpOw0K CQkJCWJyZWFrOw0KCQkJfSBjYXRjaCAoZSkge30NCgkJfQ0KDQoJCXJldHVybiBy ZXR1cm5WYWx1ZTsNCgl9DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0qLw0KDQp2YXIgUGVyaW9kaWNhbEV4ZWN1dGVyID0gQ2xhc3MuY3JlYXRlKCk7 DQpQZXJpb2RpY2FsRXhlY3V0ZXIucHJvdG90eXBlID0gew0KCWluaXRpYWxpemU6 IGZ1bmN0aW9uKGNhbGxiYWNrLCBmcmVxdWVuY3kpIHsNCgkJdGhpcy5jYWxsYmFj ayA9IGNhbGxiYWNrOw0KCQl0aGlzLmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsNCgkJ dGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsNCg0KCQl0aGlzLnJlZ2lz dGVyQ2FsbGJhY2soKTsNCgl9LA0KDQoJcmVnaXN0ZXJDYWxsYmFjazogZnVuY3Rp b24oKSB7DQoJCXNldEludGVydmFsKHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhp cyksIHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7DQoJfSwNCg0KCW9uVGltZXJFdmVu dDogZnVuY3Rpb24oKSB7DQoJCWlmICghdGhpcy5jdXJyZW50bHlFeGVjdXRpbmcp IHsNCgkJCXRyeSB7IA0KCQkJCXRoaXMuY3VycmVudGx5RXhlY3V0aW5nID0gdHJ1 ZTsNCgkJCQl0aGlzLmNhbGxiYWNrKCk7IA0KCQkJfSBmaW5hbGx5IHsgDQoJCQkJ dGhpcy5jdXJyZW50bHlFeGVjdXRpbmcgPSBmYWxzZTsNCgkJCX0NCgkJfQ0KCX0N Cn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmZ1bmN0aW9u ICQoKSB7DQoJdmFyIGVsZW1lbnRzID0gbmV3IEFycmF5KCk7DQoNCglmb3IgKHZh ciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KCQl2YXIgZWxl bWVudCA9IGFyZ3VtZW50c1tpXTsNCgkJaWYgKHR5cGVvZiBlbGVtZW50ID09ICdz dHJpbmcnKQ0KCQkJZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVs ZW1lbnQpOw0KDQoJCWlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIA0KCQkJcmV0 dXJuIGVsZW1lbnQ7DQoNCgkJZWxlbWVudHMucHVzaChlbGVtZW50KTsNCgl9DQoN CglyZXR1cm4gZWxlbWVudHM7DQp9DQoNCg0KDQp2YXIgQWpheCA9IHsNCglnZXRU cmFuc3BvcnQ6IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gVHJ5LnRoZXNlKA0KCQkJ ZnVuY3Rpb24oKSB7cmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCdNc3htbDIuWE1M SFRUUCcpfSwNCgkJCWZ1bmN0aW9uKCkge3JldHVybiBuZXcgQWN0aXZlWE9iamVj dCgnTWljcm9zb2Z0LlhNTEhUVFAnKX0sDQoJCQlmdW5jdGlvbigpIHtyZXR1cm4g bmV3IFhNTEh0dHBSZXF1ZXN0KCl9DQoJCSkgfHwgZmFsc2U7DQoJfQ0KfQ0KDQpB amF4LkJhc2UgPSBmdW5jdGlvbigpIHt9Ow0KQWpheC5CYXNlLnByb3RvdHlwZSA9 IHsNCglzZXRPcHRpb25zOiBmdW5jdGlvbihvcHRpb25zKSB7DQoJCXRoaXMub3B0 aW9ucyA9IHsNCgkJCW1ldGhvZDoJCQkgJ3Bvc3QnLA0KCQkJYXN5bmNocm9ub3Vz OiB0cnVlLA0KCQkJcGFyYW1ldGVyczoJICcnDQoJCX0NCgkJT2JqZWN0LmV4dGVu ZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMgfHwge30pOw0KCX0sDQoNCglyZXNwb25z ZUlzU3VjY2VzczogZnVuY3Rpb24oKSB7DQoJCXJldHVybiB0aGlzLnRyYW5zcG9y dC5zdGF0dXMgPT0gdW5kZWZpbmVkDQoJCQkJfHwgdGhpcy50cmFuc3BvcnQuc3Rh dHVzID09IDAgDQoJCQkJfHwgKHRoaXMudHJhbnNwb3J0LnN0YXR1cyA+PSAyMDAg JiYgdGhpcy50cmFuc3BvcnQuc3RhdHVzIDwgMzAwKTsNCgl9LA0KDQoJcmVzcG9u c2VJc0ZhaWx1cmU6IGZ1bmN0aW9uKCkgew0KCQlyZXR1cm4gIXRoaXMucmVzcG9u c2VJc1N1Y2Nlc3MoKTsNCgl9DQp9DQoNCkFqYXguUmVxdWVzdCA9IENsYXNzLmNy ZWF0ZSgpOw0KQWpheC5SZXF1ZXN0LkV2ZW50cyA9IA0KCVsnVW5pbml0aWFsaXpl ZCcsICdMb2FkaW5nJywgJ0xvYWRlZCcsICdJbnRlcmFjdGl2ZScsICdDb21wbGV0 ZSddOw0KDQpBamF4LlJlcXVlc3QucHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChu ZXcgQWpheC5CYXNlKCksIHsNCglpbml0aWFsaXplOiBmdW5jdGlvbih1cmwsIG9w dGlvbnMpIHsNCgkJdGhpcy50cmFuc3BvcnQgPSBBamF4LmdldFRyYW5zcG9ydCgp Ow0KCQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7DQoJCXRoaXMucmVxdWVzdCh1 cmwpOw0KCX0sDQoNCglyZXF1ZXN0OiBmdW5jdGlvbih1cmwpIHsNCgkJdmFyIHBh cmFtZXRlcnMgPSB0aGlzLm9wdGlvbnMucGFyYW1ldGVycyB8fCAnJzsNCgkJaWYg KHBhcmFtZXRlcnMubGVuZ3RoID4gMCkgcGFyYW1ldGVycyArPSAnJl89JzsNCg0K CQl0cnkgew0KCQkJaWYgKHRoaXMub3B0aW9ucy5tZXRob2QgPT0gJ2dldCcpDQoJ CQkJdXJsICs9ICc/JyArIHBhcmFtZXRlcnM7DQoNCgkJCXRoaXMudHJhbnNwb3J0 Lm9wZW4odGhpcy5vcHRpb25zLm1ldGhvZCwgdXJsLA0KCQkJCXRoaXMub3B0aW9u cy5hc3luY2hyb25vdXMpOw0KDQoJCQlpZiAodGhpcy5vcHRpb25zLmFzeW5jaHJv bm91cykgew0KCQkJCXRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9 IHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpOw0KCQkJCXNldFRpbWVvdXQo KGZ1bmN0aW9uKCkge3RoaXMucmVzcG9uZFRvUmVhZHlTdGF0ZSgxKX0pLmJpbmQo dGhpcyksIDEwKTsNCgkJCX0NCg0KCQkJdGhpcy5zZXRSZXF1ZXN0SGVhZGVycygp Ow0KDQoJCQl2YXIgYm9keSA9IHRoaXMub3B0aW9ucy5wb3N0Qm9keSA/IHRoaXMu b3B0aW9ucy5wb3N0Qm9keSA6IHBhcmFtZXRlcnM7DQoJCQl0aGlzLnRyYW5zcG9y dC5zZW5kKHRoaXMub3B0aW9ucy5tZXRob2QgPT0gJ3Bvc3QnID8gYm9keSA6IG51 bGwpOw0KDQoJCX0gY2F0Y2ggKGUpIHsNCgkJfQ0KCX0sDQoNCglzZXRSZXF1ZXN0 SGVhZGVyczogZnVuY3Rpb24oKSB7DQoJCXZhciByZXF1ZXN0SGVhZGVycyA9IA0K CQkJWydYLVJlcXVlc3RlZC1XaXRoJywgJ1hNTEh0dHBSZXF1ZXN0JywNCgkJCSAn WC1Qcm90b3R5cGUtVmVyc2lvbicsIFByb3RvdHlwZS5WZXJzaW9uXTsNCg0KCQlp ZiAodGhpcy5vcHRpb25zLm1ldGhvZCA9PSAncG9zdCcpIHsNCgkJCXJlcXVlc3RI ZWFkZXJzLnB1c2goJ0NvbnRlbnQtdHlwZScsIA0KCQkJCSdhcHBsaWNhdGlvbi94 LXd3dy1mb3JtLXVybGVuY29kZWQnKTsNCg0KCQkJLyogRm9yY2UgIkNvbm5lY3Rp b246IGNsb3NlIiBmb3IgTW96aWxsYSBicm93c2VycyB0byB3b3JrIGFyb3VuZA0K CQkJICogYSBidWcgd2hlcmUgWE1MSHR0cFJlcWV1ZXN0IHNlbmRzIGFuIGluY29y cmVjdCBDb250ZW50LWxlbmd0aA0KCQkJICogaGVhZGVyLiBTZWUgTW96aWxsYSBC dWd6aWxsYSAjMjQ2NjUxLiANCgkJCSAqLw0KCQkJaWYgKHRoaXMudHJhbnNwb3J0 Lm92ZXJyaWRlTWltZVR5cGUpDQoJCQkJcmVxdWVzdEhlYWRlcnMucHVzaCgnQ29u bmVjdGlvbicsICdjbG9zZScpOw0KCQl9DQoNCgkJaWYgKHRoaXMub3B0aW9ucy5y ZXF1ZXN0SGVhZGVycykNCgkJCXJlcXVlc3RIZWFkZXJzLnB1c2guYXBwbHkocmVx dWVzdEhlYWRlcnMsIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVycyk7DQoNCgkJ Zm9yICh2YXIgaSA9IDA7IGkgPCByZXF1ZXN0SGVhZGVycy5sZW5ndGg7IGkgKz0g MikNCgkJCXRoaXMudHJhbnNwb3J0LnNldFJlcXVlc3RIZWFkZXIocmVxdWVzdEhl YWRlcnNbaV0sIHJlcXVlc3RIZWFkZXJzW2krMV0pOw0KCX0sDQoNCglvblN0YXRl Q2hhbmdlOiBmdW5jdGlvbigpIHsNCgkJdmFyIHJlYWR5U3RhdGUgPSB0aGlzLnRy YW5zcG9ydC5yZWFkeVN0YXRlOw0KCQlpZiAocmVhZHlTdGF0ZSAhPSAxKQ0KCQkJ dGhpcy5yZXNwb25kVG9SZWFkeVN0YXRlKHRoaXMudHJhbnNwb3J0LnJlYWR5U3Rh dGUpOw0KCX0sDQoJDQoJZXZhbEpTT046IGZ1bmN0aW9uKCkgew0KCQl0cnkgew0K CQkJdmFyIGpzb24gPSB0aGlzLnRyYW5zcG9ydC5nZXRSZXNwb25zZUhlYWRlcign WC1KU09OJyksIG9iamVjdDsNCgkJCW9iamVjdCA9IGV2YWwoanNvbik7DQoJCQly ZXR1cm4gb2JqZWN0Ow0KCQl9IGNhdGNoIChlKSB7DQoJCX0NCgl9LA0KDQoJcmVz cG9uZFRvUmVhZHlTdGF0ZTogZnVuY3Rpb24ocmVhZHlTdGF0ZSkgew0KCQl2YXIg ZXZlbnQgPSBBamF4LlJlcXVlc3QuRXZlbnRzW3JlYWR5U3RhdGVdOw0KCQl2YXIg dHJhbnNwb3J0ID0gdGhpcy50cmFuc3BvcnQsIGpzb24gPSB0aGlzLmV2YWxKU09O KCk7DQoNCgkJaWYgKGV2ZW50ID09ICdDb21wbGV0ZScpDQoJCQkodGhpcy5vcHRp b25zWydvbicgKyB0aGlzLnRyYW5zcG9ydC5zdGF0dXNdDQoJCQkgfHwgdGhpcy5v cHRpb25zWydvbicgKyAodGhpcy5yZXNwb25zZUlzU3VjY2VzcygpID8gJ1N1Y2Nl c3MnIDogJ0ZhaWx1cmUnKV0NCgkJCSB8fCBQcm90b3R5cGUuZW1wdHlGdW5jdGlv bikodHJhbnNwb3J0LCBqc29uKTsNCg0KCQkodGhpcy5vcHRpb25zWydvbicgKyBl dmVudF0gfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb24pKHRyYW5zcG9ydCwganNv bik7DQoNCgkJLyogQXZvaWQgbWVtb3J5IGxlYWsgaW4gTVNJRTogY2xlYW4gdXAg dGhlIG9uY29tcGxldGUgZXZlbnQgaGFuZGxlciAqLw0KCQlpZiAoZXZlbnQgPT0g J0NvbXBsZXRlJykNCgkJCXRoaXMudHJhbnNwb3J0Lm9ucmVhZHlzdGF0ZWNoYW5n ZSA9IFByb3RvdHlwZS5lbXB0eUZ1bmN0aW9uOw0KCX0NCn0pOw0KDQpBamF4LlVw ZGF0ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkFqYXguVXBkYXRlci5TY3JpcHRGcmFn bWVudCA9ICcoPzo8c2NyaXB0Lio/PikoKFxufC4pKj8pKD86PFwvc2NyaXB0Pikn Ow0KDQpPYmplY3QuZXh0ZW5kKE9iamVjdC5leHRlbmQoQWpheC5VcGRhdGVyLnBy b3RvdHlwZSwgQWpheC5SZXF1ZXN0LnByb3RvdHlwZSksIHsNCglpbml0aWFsaXpl OiBmdW5jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0KCQl0aGlzLmNv bnRhaW5lcnMgPSB7DQoJCQlzdWNjZXNzOiBjb250YWluZXIuc3VjY2VzcyA/ICQo Y29udGFpbmVyLnN1Y2Nlc3MpIDogJChjb250YWluZXIpLA0KCQkJZmFpbHVyZTog Y29udGFpbmVyLmZhaWx1cmUgPyAkKGNvbnRhaW5lci5mYWlsdXJlKSA6DQoJCQkJ KGNvbnRhaW5lci5zdWNjZXNzID8gbnVsbCA6ICQoY29udGFpbmVyKSkNCgkJfQ0K DQoJCXRoaXMudHJhbnNwb3J0ID0gQWpheC5nZXRUcmFuc3BvcnQoKTsNCgkJdGhp cy5zZXRPcHRpb25zKG9wdGlvbnMpOw0KDQoJCXZhciBvbkNvbXBsZXRlID0gdGhp cy5vcHRpb25zLm9uQ29tcGxldGUgfHwgUHJvdG90eXBlLmVtcHR5RnVuY3Rpb247 DQoJCXRoaXMub3B0aW9ucy5vbkNvbXBsZXRlID0gKGZ1bmN0aW9uKHRyYW5zcG9y dCwgb2JqZWN0KSB7DQoJCQl0aGlzLnVwZGF0ZUNvbnRlbnQoKTsNCgkJCW9uQ29t cGxldGUodHJhbnNwb3J0LCBvYmplY3QpOw0KCQl9KS5iaW5kKHRoaXMpOw0KDQoJ CXRoaXMucmVxdWVzdCh1cmwpOw0KCX0sDQoNCgl1cGRhdGVDb250ZW50OiBmdW5j dGlvbigpIHsNCgkJdmFyIHJlY2VpdmVyID0gdGhpcy5yZXNwb25zZUlzU3VjY2Vz cygpID8NCgkJCXRoaXMuY29udGFpbmVycy5zdWNjZXNzIDogdGhpcy5jb250YWlu ZXJzLmZhaWx1cmU7DQoNCgkJdmFyIG1hdGNoCQk9IG5ldyBSZWdFeHAoQWpheC5V cGRhdGVyLlNjcmlwdEZyYWdtZW50LCAnaW1nJyk7DQoJCXZhciByZXNwb25zZSA9 IHRoaXMudHJhbnNwb3J0LnJlc3BvbnNlVGV4dC5yZXBsYWNlKG1hdGNoLCAnJyk7 DQoJCXZhciBzY3JpcHRzCT0gdGhpcy50cmFuc3BvcnQucmVzcG9uc2VUZXh0Lm1h dGNoKG1hdGNoKTsNCg0KCQlpZiAocmVjZWl2ZXIpIHsNCgkJCWlmICh0aGlzLm9w dGlvbnMuaW5zZXJ0aW9uKSB7DQoJCQkJbmV3IHRoaXMub3B0aW9ucy5pbnNlcnRp b24ocmVjZWl2ZXIsIHJlc3BvbnNlKTsNCgkJCX0gZWxzZSB7DQoJCQkJcmVjZWl2 ZXIuaW5uZXJIVE1MID0gcmVzcG9uc2U7DQoJCQl9DQoJCX0NCg0KCQlpZiAodGhp cy5yZXNwb25zZUlzU3VjY2VzcygpKSB7DQoJCQlpZiAodGhpcy5vbkNvbXBsZXRl KQ0KCQkJCXNldFRpbWVvdXQodGhpcy5vbkNvbXBsZXRlLmJpbmQodGhpcyksIDEw KTsNCgkJfQ0KDQoJCWlmICh0aGlzLm9wdGlvbnMuZXZhbFNjcmlwdHMgJiYgc2Ny aXB0cykgew0KCQkJbWF0Y2ggPSBuZXcgUmVnRXhwKEFqYXguVXBkYXRlci5TY3Jp cHRGcmFnbWVudCwgJ2ltJyk7DQoJCQlzZXRUaW1lb3V0KChmdW5jdGlvbigpIHsN CgkJCQlmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdHMubGVuZ3RoOyBpKyspDQoJ CQkJCWV2YWwoc2NyaXB0c1tpXS5tYXRjaChtYXRjaClbMV0pOw0KCQkJfSkuYmlu ZCh0aGlzKSwgMTApOw0KCQl9DQoJfQ0KfSk7DQoNCkFqYXguUGVyaW9kaWNhbFVw ZGF0ZXIgPSBDbGFzcy5jcmVhdGUoKTsNCkFqYXguUGVyaW9kaWNhbFVwZGF0ZXIu cHJvdG90eXBlID0gT2JqZWN0LmV4dGVuZChuZXcgQWpheC5CYXNlKCksIHsNCglp bml0aWFsaXplOiBmdW5jdGlvbihjb250YWluZXIsIHVybCwgb3B0aW9ucykgew0K CQl0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7DQoJCXRoaXMub25Db21wbGV0ZSA9 IHRoaXMub3B0aW9ucy5vbkNvbXBsZXRlOw0KDQoJCXRoaXMuZnJlcXVlbmN5ID0g KHRoaXMub3B0aW9ucy5mcmVxdWVuY3kgfHwgMik7DQoJCXRoaXMuZGVjYXkgPSAx Ow0KDQoJCXRoaXMudXBkYXRlciA9IHt9Ow0KCQl0aGlzLmNvbnRhaW5lciA9IGNv bnRhaW5lcjsNCgkJdGhpcy51cmwgPSB1cmw7DQoNCgkJdGhpcy5zdGFydCgpOw0K CX0sDQoNCglzdGFydDogZnVuY3Rpb24oKSB7DQoJCXRoaXMub3B0aW9ucy5vbkNv bXBsZXRlID0gdGhpcy51cGRhdGVDb21wbGV0ZS5iaW5kKHRoaXMpOw0KCQl0aGlz Lm9uVGltZXJFdmVudCgpOw0KCX0sDQoNCglzdG9wOiBmdW5jdGlvbigpIHsNCgkJ dGhpcy51cGRhdGVyLm9uQ29tcGxldGUgPSB1bmRlZmluZWQ7DQoJCWNsZWFyVGlt ZW91dCh0aGlzLnRpbWVyKTsNCgkJKHRoaXMub25Db21wbGV0ZSB8fCBBamF4LmVt cHR5RnVuY3Rpb24pLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQoJfSwNCg0KCXVw ZGF0ZUNvbXBsZXRlOiBmdW5jdGlvbihyZXF1ZXN0KSB7DQoJCWlmICh0aGlzLm9w dGlvbnMuZGVjYXkpIHsNCgkJCXRoaXMuZGVjYXkgPSAocmVxdWVzdC5yZXNwb25z ZVRleHQgPT0gdGhpcy5sYXN0VGV4dCA/IA0KCQkJCXRoaXMuZGVjYXkgKiB0aGlz Lm9wdGlvbnMuZGVjYXkgOiAxKTsNCg0KCQkJdGhpcy5sYXN0VGV4dCA9IHJlcXVl c3QucmVzcG9uc2VUZXh0Ow0KCQl9DQoJCXRoaXMudGltZXIgPSBzZXRUaW1lb3V0 KHRoaXMub25UaW1lckV2ZW50LmJpbmQodGhpcyksIA0KCQkJdGhpcy5kZWNheSAq IHRoaXMuZnJlcXVlbmN5ICogMTAwMCk7DQoJfSwNCg0KCW9uVGltZXJFdmVudDog ZnVuY3Rpb24oKSB7DQoJCXRoaXMudXBkYXRlciA9IG5ldyBBamF4LlVwZGF0ZXIo dGhpcy5jb250YWluZXIsIHRoaXMudXJsLCB0aGlzLm9wdGlvbnMpOw0KCX0NCn0p Ow0KDQovLyBjcHVfd29ybGRfYXMuanMNCi8vDQovLyBBdXRvU3VnZ2VzdCBjb2Rl DQovLw0KdmFyIEFTX2luX29iamVjdDsNCnZhciBBU19taW5fY2hhcnMgPSAzOw0K dmFyIEFTX2FjdGl2ZSA9IDA7DQp2YXIgQVNfY29sb3I7DQp2YXIgQVNfY29sb3Jf c2V0ID0gMDsNCnZhciBBU19hY3Rpb247DQp2YXIgQVNfaW5fZmllbGQ7DQp2YXIg QVNfb25rZXlkb3duOw0KdmFyIEFTX29ubW91c2Vkb3duDQp2YXIgQVNfYXV0b2Nv bXBsZXRlOw0KdmFyIEFTX2Nob2ljZSA9IC0xOw0KdmFyIEFTX2ZpcnN0X3RpbWUg PSBuZXcgT2JqZWN0KCk7DQp2YXIgQVNfc2V0X3ZhbHVlOw0KdmFyIEFTX2xpc3Rf cHJlZml4Ow0KDQpmdW5jdGlvbglBU19Gb2N1cyAocF9vYmplY3QsIHBfYWN0aW9u LCBwX2RlbGF5LCBwX21pbiwgcF9zZXQsIHBfbGlzdCkNCnsNCg0KCWlmCSghcF9v YmplY3QuaWQpDQoJew0KCQkvLwlTZWUgaWYgYW55IG90aGVyIG9iamVjdCBpbiB0 aGUgZG9jdW1lbnQgaGFzIHRoaXMgaWQNCgkJdmFyIG9iaiA9IGRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKHBfb2JqZWN0Lm5hbWUpOw0KCQkvLwlPYmplY3Qgd2l0aCB0 aGlzIGlkIGFscmVhZHkgZXhpc3RzIC0gY2FuJ3QgZG8gYW55dGhpbmcNCgkJaWYJ KG9iaiAhPSBudWxsKQ0KCQl7DQoJCQlhbGVydCgiRmllbGQgJyIgKyBwX29iamVj dC5uYW1lICsgIicgZG9lc24ndCBoYXZlIGFuIGlkLlxuQXV0b1N1Z2dlc3Qgd2ls bCBub3Qgd29yayBmb3IgdGhpcyBmaWVsZCIpOw0KCQkJcmV0dXJuOw0KCQl9DQoJ CS8vCVNpbmNlIHRoZXJlIGlzIG5vIG90aGVyIG9iamVjdCB3aXRoIHRoZSBzYW1l IGlkIC0gYXNzaWduDQoJCS8vCWlkIHRvIHRoZSBvYmplY3QNCgkJcF9vYmplY3Qu aWQgPSBwX29iamVjdC5uYW1lOw0KCX0NCglBU19hY3Rpb24gPSBwX2FjdGlvbjsN CglpZgkocF9kZWxheSA9PSBudWxsKQlwX2RlbGF5ID0gMjAwOw0KCVdhdGNoaW5n X1N0YXJ0KG51bGwsIHBfb2JqZWN0LCBBU19TZW5kUmVxdWVzdCwgcF9kZWxheSk7 DQoNCgkvLwlTYXZlIGFsbCBkYXRhDQoJQVNfaW5fb2JqZWN0ID0gcF9vYmplY3Q7 DQoJQVNfbWluX2NoYXJzID0gKChwX21pbiAhPSBudWxsKT8gcF9taW46IDMpOw0K CUFTX2FjdGl2ZSA9IDE7DQoJQVNfY29sb3IgPSBwX29iamVjdC5zdHlsZS5jb2xv cjsNCglBU19vbmtleWRvd24gPSBwX29iamVjdC5vbmtleWRvd247DQoJQVNfb25t b3VzZWRvd24gPSBkb2N1bWVudC5vbm1vdXNlZG93bjsNCglBU19hdXRvY29tcGxl dGUgPSBwX29iamVjdC5hdXRvY29tcGxldGU7DQoJQVNfY2hvaWNlID0gLTE7DQoJ QVNfc2V0X3ZhbHVlID0gcF9zZXQ7DQoJQVNfbGlzdF9wcmVmaXggPSBwX2xpc3Q7 DQoJcF9vYmplY3Qub25rZXlkb3duID0gQVNfSW5wdXRLZXk7DQoJZG9jdW1lbnQu b25tb3VzZWRvd24gPSBBU19Eb2NNb3VzZTsNCglwX29iamVjdC5hdXRvY29tcGxl dGUgPSAnb2ZmJzsNCg0KCXZhciBpZCA9IHBfb2JqZWN0LmlkOw0KCWlmCSgoIUFT X2ZpcnN0X3RpbWVbaWRdKSYmKEFTX21pbl9jaGFycyA9PSAwKSkNCgl7DQoJCUFT X2ZpcnN0X3RpbWVbaWRdID0gMTsNCgkJQVNfU2VuZFJlcXVlc3QgKHBfb2JqZWN0 LmlkLCBwX29iamVjdC52YWx1ZSwgMSk7DQoJfQ0KfQ0KDQpmdW5jdGlvbglBU19T ZW5kUmVxdWVzdCAocF9pZCwgcF92YWx1ZSwgcF9mb3JjZSkNCnsNCg0KCXZhciBs ZW4gPSBwX3ZhbHVlLmxlbmd0aDsNCglpZgkoKEFTX21pbl9jaGFycyA+IDApJiYN CgkJICgobGVuIDwgMSl8fCgobGVuIDwgQVNfbWluX2NoYXJzKSYmKHBfZm9yY2Ug PT0gbnVsbCkpKSkNCgl7DQoJCXZhciBkaXZfb2JqID0gZG9jdW1lbnQuZ2V0RWxl bWVudEJ5SWQgKCdBdXRvU3VnZ2VzdCcpOw0KCQlpZgkoKGRpdl9vYmogIT0gbnVs bCkmJihkaXZfb2JqLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSkNCgkJCWRpdl9v Ymouc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCgkJcmV0dXJuOw0KCX0NCg0KCUFT X2luX2ZpZWxkID0gcF9pZDsNCglpZgkodHlwZW9mIEFTX2FjdGlvbiA9PSAnZnVu Y3Rpb24nKQ0KCXsNCgkJdmFyIGFyciA9IEFTX2FjdGlvbiAocF9pZCwgcF92YWx1 ZSk7DQoJCWlmCSh0eXBlb2YgYXJyID09ICdzdHJpbmcnKQ0KCQkJYWxlcnQoYXJy KTsNCgkJZWxzZQ0KCQkJQVNfUHJvY2VzcyhhcnIpOw0KCX0NCgllbHNlIGlmCSh0 eXBlb2YgQVNfYWN0aW9uID09ICdzdHJpbmcnKQ0KCXsNCgkJdmFyIGEgPSBBU19h Y3Rpb24uc3BsaXQoL1w/Lyk7DQoJCXZhciB1cmwsIHBhcmFtczsNCgkJaWYJKGEg PT0gbnVsbCkNCgkJew0KCQkJdXJsID0gQVNfYWN0aW9uOw0KCQkJcGFyYW1zID0g Jyc7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl1cmwgPSBhWzBdOw0KCQkJcGFyYW1z ID0gYVsxXTsNCgkJCWlmCShwYXJhbXMgPT0gbnVsbCkJcGFyYW1zID0gJyc7DQoJ CQlwX3ZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHBfdmFsdWUpOw0KCQkJcGFy YW1zID0gcGFyYW1zLnJlcGxhY2UoL1wlX1ZBTFVFJS9nLCBwX3ZhbHVlKTsNCgkJ CXBfaWQgPSBlbmNvZGVVUklDb21wb25lbnQocF9pZCk7DQoJCQlwYXJhbXMgPSBw YXJhbXMucmVwbGFjZSgvXCVfSUQlL2csIHBfaWQpOw0KDQoJCQlwYXJhbXMgPSBw YXJhbXMucmVwbGFjZSgvXCUoXHcrKVwlL2csIFJlcGxhY2VBY3Rpb25TdHJpbmcp Ow0KCQl9DQoNCgkJbmV3IEFqYXguUmVxdWVzdCh1cmwsDQoJCXsNCgkJCW1ldGhv ZDogJ2dldCcsDQoJCQlwYXJhbWV0ZXJzOiBwYXJhbXMsDQoJCQlvblN1Y2Nlc3M6 IEFTX0NhbGxiYWNrDQoJCX0pOw0KCX0NCgllbHNlIGlmICh0eXBlb2YgQVNfYWN0 aW9uID09ICdvYmplY3QnKQ0KCXsNCgkJdmFyIGEgPSBuZXcgQXJyYXkgKCk7DQoJ CXZhciBsZW4gPSBBU19hY3Rpb24ubGVuZ3RoOw0KCQl2YXIgaTsNCgkJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKQ0KCQl7DQoJCQlpZgkoQVNfYWN0aW9uW2ldLmlu ZGV4T2YocF92YWx1ZSkgIT0gLTEpDQoJCQkJYS5wdXNoIChBU19hY3Rpb25baV0p Ow0KCQl9DQoJCUFTX1Byb2Nlc3MoYSk7DQoJfQ0KfQ0KDQpmdW5jdGlvbglBU19D YWxsYmFjayAocF90cmFuc3BvcnQpDQp7DQoNCgkvLwlEb24ndCBkbyBhbnl0aGlu ZyBpZiBBdXRvU3VnZ2VzdCBmZWF0dXJlIGlzIG5vdCBhY3RpdmUNCglpZgkoIUFT X2FjdGl2ZSkJCXJldHVybjsNCg0KCXZhciBkaXZfb2JqID0gZG9jdW1lbnQuZ2V0 RWxlbWVudEJ5SWQgKCdBdXRvU3VnZ2VzdCcpOw0KDQoJLy8JQ2hlY2sgZm9yIGVy cm9yDQoJdGV4dCA9IHBfdHJhbnNwb3J0LnJlc3BvbnNlVGV4dDsNCglpZgkodGV4 dC5tYXRjaCAoL15FUlJPUjovKSkNCgl7DQoJCWlmCShkaXZfb2JqICE9IG51bGwp DQoJCQlkaXZfb2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCWFsZXJ0KHRl eHQpOw0KCQlyZXR1cm47DQoJfQ0KDQoJLy8JR2V0IFRFWFQgZmllbGQgbmFtZQ0K CXZhciBhID0gdGV4dC5zcGxpdCAoL1xzKlxuLyk7DQoJdmFyIGZpZWxkID0gYS5z aGlmdCgpOw0KCWZpZWxkID0gZmllbGQucmVwbGFjZSgvXklORk86XHMqLywgJycp Ow0KCS8vCVByb2Nlc3MgdGhlIHJlc3BvbnNlIG9ubHkgaWYgZmllbGQgaWQgbWF0 Y2hlcyB3aXRoIGZpZWxkIGlkDQoJLy8Jd2UncmUgY3VycmVudGx5IHdvcmtpbmcg d2l0aA0KCWlmCShmaWVsZCAhPSBBU19pbl9maWVsZCkJcmV0dXJuOw0KCWlmCSgo YVswXSAhPSBudWxsKSYmKGFbMF0ubWF0Y2ggKC9eRVJST1I6LykpKQ0KCXsNCgkJ aWYJKGRpdl9vYmogIT0gbnVsbCkNCgkJCWRpdl9vYmouc3R5bGUuZGlzcGxheSA9 ICdub25lJzsNCgkJYWxlcnQoYS5qb2luKCJcbiIpKTsNCgkJcmV0dXJuOw0KCX0N Cg0KCUFTX1Byb2Nlc3MoYSk7DQp9DQoNCmZ1bmN0aW9uCUFTX1Byb2Nlc3MgKHBf ZGF0YSkNCnsNCg0KCXZhciBmaWVsZF9vYmogPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCAoQVNfaW5fZmllbGQpOw0KCWlmCShmaWVsZF9vYmogPT0gbnVsbCkNCgl7 DQoJCWFsZXJ0ICgiQ2Fubm90IGZpbmQgVEVYVCBmaWVsZCB3aXRoIGlkICciICsg QVNfaW5fZmllbGQgKyAiJyEiKTsNCgkJcmV0dXJuOw0KCX0NCg0KCS8vCUNyZWF0 ZSBkaXYgd2l0aCBzZWxlY3QgYm94IGlmIG5lY2Vzc2FyeQ0KCXZhciBkaXZfb2Jq ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKCdBdXRvU3VnZ2VzdCcpOw0KCWlm CShkaXZfb2JqID09IG51bGwpDQoJew0KCQlkaXZfb2JqID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCAoJ2RpdicpOw0KCQlkaXZfb2JqLmlkID0gJ0F1dG9TdWdnZXN0 JzsNCgkJZGl2X29iai5jbGFzc05hbWUgPSAnQXV0b1N1Z2dlc3QnOw0KCQlkaXZf b2JqLnpJbmRleCA9IDIwOw0KCQlkaXZfb2JqLnN0eWxlLnBvc2l0aW9uID0gJ2Fi c29sdXRlJzsNCgkJZGl2X29iai5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQlk aXZfb2JqLnN0eWxlLmhlaWdodCA9ICdhdXRvJzsNCgkJZGl2X29iai5zdHlsZS5v dmVyZmxvdyA9ICdhdXRvJzsNCgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChk aXZfb2JqKTsNCgl9DQoJZGl2X29iai5zdHlsZS53aWR0aCA9IGZpZWxkX29iai5v ZmZzZXRXaWR0aCArICdweCc7DQoJZGl2X29iai5zdHlsZS5taW5XaWR0aCA9IGZp ZWxkX29iai5vZmZzZXRXaWR0aCArICdweCc7DQoNCgkvLwlVcGRhdGUgY29udGVu dCBvZiB0aGUgQXV0b1N1Z2dlc3QgRElWIG9iamVjdA0KCXZhciBsZW4gPSBwX2Rh dGEubGVuZ3RoOw0KCXZhciBodG1sID0gbmV3IEFycmF5ICgpOw0KCXZhciBpLCBq LCBzLCB2LCBiZzsNCglmb3IgKGkgPSAwLCBqID0gMCwgYmcgPSAxOyBpIDwgbGVu OyBpKyspDQoJew0KCQlpZgkocF9kYXRhW2ldID09ICcnKQljb250aW51ZTsNCgkJ cyA9IHBfZGF0YVtpXTsNCgkJaWYJKHMgPT0gJy0tLX5+ficpDQoJCXsNCgkJCXMg PSAiPGhyIGNsYXNzPSdBdXRvU3VnZ2VzdFNlcGFyYXRvcic+IjsNCgkJCXYgPSAn JzsNCgkJCWJnID0gMDsNCgkJfQ0KCQllbHNlIGlmCShzLnNlYXJjaCgvXiguKil+ fn4oLiopJC8pICE9IC0xKQ0KCQl7DQoJCQlzID0gUmVnRXhwLiQxOw0KCQkJdiA9 IFJlZ0V4cC4kMjsNCgkJfQ0KCQllbHNlDQoJCQl2ID0gczsNCgkJaHRtbC5wdXNo KCI8ZGl2IGNsYXNzPSdBdXRvU3VnZ2VzdENob2ljZSIgKyAoKGJnID09IDIpPyAn Mic6ICcnKSArDQoJCQkiJyBvbk1vdXNlT3Zlcj0nQVNfTU92ZXIodGhpcywxLCIg KyBqICsNCgkJCSIpJyBvbkZvY3VzPSdBU19NT3Zlcih0aGlzLDEsIiArIGogKw0K CQkJIiknIG9uTW91c2VPdXQ9J0FTX01PdmVyKHRoaXMsMCwiICsgaiArDQoJCQki KScgb25CbHVyPSdBU19NT3Zlcih0aGlzLDAsIiArIGogKw0KCQkJIiknIG9uQ2xp Y2s9J3JldHVybiBBU19Db3B5VmFsdWUoXCIiICsgZXNjYXBlKHYpICsgIlwiKSc+ IiArIHMgKyAiPC9kaXY+Iik7DQoJCWlmCShBU19saXN0X3ByZWZpeCkJYmcgPSAo YmcgPT0gMSk/IDI6IDE7DQoJCWorKzsNCgl9DQoJaWYJKGh0bWwubGVuZ3RoID09 IDApDQoJew0KCQlkaXZfb2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCUFT X2luX29iamVjdC5zdHlsZS5jb2xvciA9ICcjQzAwMDAwJzsNCgkJQVNfY29sb3Jf c2V0ID0gMTsNCgkJcmV0dXJuOw0KLy8JCWh0bWwucHVzaCAoIjxkaXYgY2xhc3M9 J0F1dG9TdWdnZXN0Tm9uZScgb25DbGljaz0nQVNfQ29weVZhbHVlKCknPk5vIG1h dGNoZXMgZm91bmQ8L2Rpdj4iKTsNCgl9DQoJaWYJKChodG1sLmxlbmd0aCA9PSAx KSYmKHMgPT0gQVNfaW5fb2JqZWN0LnZhbHVlKSkNCgl7DQoJCWRpdl9vYmouc3R5 bGUuZGlzcGxheSA9ICdub25lJzsNCgkJQVNfaW5fb2JqZWN0LnN0eWxlLmNvbG9y ID0gJyMwMEMwMDAnOw0KCQlBU19jb2xvcl9zZXQgPSAxOw0KCQlyZXR1cm47DQov LwkJaHRtbC5wdXNoICgiPGRpdiBjbGFzcz0nQXV0b1N1Z2dlc3ROb25lJyBvbkNs aWNrPSdBU19Db3B5VmFsdWUoKSc+Tm8gbWF0Y2hlcyBmb3VuZDwvZGl2PiIpOw0K CX0NCglpZgkoQVNfY29sb3Jfc2V0KQ0KCXsNCgkJQVNfaW5fb2JqZWN0LnN0eWxl LmNvbG9yID0gQVNfY29sb3I7DQoJCUFTX2NvbG9yX3NldCA9IDA7DQoJfQ0KDQoJ ZGl2X29iai5pbm5lckhUTUwgPSBodG1sLmpvaW4oIlxuIik7DQoJLy8JRGV0ZXJt aW5lIHRleHQgZmllbGQncyBwb3NpdGlvbg0KCXZhciB4ID0gZmllbGRfb2JqLm9m ZnNldExlZnQ7DQoJdmFyIHkgPSBmaWVsZF9vYmoub2Zmc2V0VG9wICsgZmllbGRf b2JqLm9mZnNldEhlaWdodDsNCgl2YXIgcGFyZW50ID0gZmllbGRfb2JqLm9mZnNl dFBhcmVudDsNCgl3aGlsZSAocGFyZW50ICE9IG51bGwpDQoJew0KCQl4ICs9IHBh cmVudC5vZmZzZXRMZWZ0Ow0KCQl5ICs9IHBhcmVudC5vZmZzZXRUb3A7DQoJCXBh cmVudCA9IHBhcmVudC5vZmZzZXRQYXJlbnQ7DQoJfQ0KCWRpdl9vYmouc3R5bGUu aGVpZ2h0ID0gbnVsbDsNCgkvLwlNYWtlIGRpdiB2aXNpYmxlDQoJZGl2X29iai5z dHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsNCglDV19EaXZQb3NpdGlvbiAobnVsbCwg J0F1dG9TdWdnZXN0JywgeCwgeSwgMik7DQp9DQoNCi8vIHBfZm9jdXM6IDAgLSBo aWRlLCAxIC0gc2hvdyAobm8gc2Nyb2xsaW5nKSwgMiAtIHNob3cgKHNjcm9sbCBp bnRvIHZpZXcpDQpmdW5jdGlvbiBBU19NT3ZlcihwX29iaiwgcF9mb2N1cywgcF9u KQ0Kew0KDQoJdmFyIGNsYXNzX25hbWU7DQoJaWYJKChBU19jaG9pY2UgPj0gMCkm JihwX24gIT0gQVNfY2hvaWNlKSkNCgl7DQoJCXZhciBkaXZfb2JqID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQgKCdBdXRvU3VnZ2VzdCcpOw0KCQlpZgkoZGl2X29i aiAhPSBudWxsKQ0KCQl7DQoJCQl2YXIgZGl2cyA9IGRpdl9vYmouZ2V0RWxlbWVu dHNCeVRhZ05hbWUoJ0RJVicpOw0KCQkJaWYJKChkaXZzICE9IG51bGwpJiYoQVNf Y2hvaWNlIDwgZGl2cy5sZW5ndGgpKQ0KCQkJew0KCQkJCWNsYXNzX25hbWUgPSBk aXZzW0FTX2Nob2ljZV0uY2xhc3NOYW1lOw0KCQkJCWRpdnNbQVNfY2hvaWNlXS5j bGFzc05hbWUgPQ0KCQkJCQljbGFzc19uYW1lLnJlcGxhY2UoL15BdXRvU3VnZ2Vz dFNlbGVjdGVkLywgIkF1dG9TdWdnZXN0Q2hvaWNlIik7DQoJCQl9DQoJCQlBU19j aG9pY2UgPSAtMTsNCgkJfQ0KCX0NCg0KCWNsYXNzX25hbWUgPSBwX29iai5jbGFz c05hbWU7DQoJaWYJKHBfZm9jdXMpDQoJew0KCQlwX29iai5jbGFzc05hbWUgPQ0K CQkJY2xhc3NfbmFtZS5yZXBsYWNlKC9eQXV0b1N1Z2dlc3RDaG9pY2UvLCAiQXV0 b1N1Z2dlc3RTZWxlY3RlZCIpOw0KCQlpZgkocF9mb2N1cyA9PSAyKQ0KCQkJU2Ny b2xsSW50b1ZpZXcgKHBfb2JqKTsNCgkJQVNfY2hvaWNlID0gcF9uOw0KCX0NCgll bHNlDQoJew0KCQlwX29iai5jbGFzc05hbWUgPQ0KCQkJY2xhc3NfbmFtZS5yZXBs YWNlKC9eQXV0b1N1Z2dlc3RTZWxlY3RlZC8sICJBdXRvU3VnZ2VzdENob2ljZSIp Ow0KCQlBU19jaG9pY2UgPSAtMTsNCgl9DQp9DQoNCmZ1bmN0aW9uCUFTX0lucHV0 S2V5IChwX2V2ZW50KQ0Kew0KCS8vCUlmIHRoZXJlIHdhcyBhbiBhY3RpdmUgb25r ZXlkb3duIGhhbmRsZXIgLSBpbnZva2UgaXQNCglpZgkoQVNfb25rZXlkb3duICE9 IG51bGwpDQoJCUFTX29ua2V5ZG93biAocF9ldmVudCk7DQoNCglpZgkoQVNfY2hv aWNlID49IDApDQoJew0KCQlBU19BS2V5IChwX2V2ZW50LCBBU19jaG9pY2UpOw0K CQlpZgkoIXBfZXZlbnQpCXBfZXZlbnQgPSB3aW5kb3cuZXZlbnQ7DQoJCWlmCShw X2V2ZW50KQ0KCQl7DQoJCQlwX2V2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7DQoJ CQlpZgkocF9ldmVudC5zdG9wUHJvcGFnYXRpb24pDQoJCQkJcF9ldmVudC5zdG9w UHJvcGFnYXRpb24oKTsNCgkJfQ0KDQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCglp ZgkoQVNfY29sb3Jfc2V0KQ0KCXsNCgkJQVNfaW5fb2JqZWN0LnN0eWxlLmNvbG9y ID0gQVNfY29sb3I7DQoJCUFTX2NvbG9yX3NldCA9IDA7DQoJfQ0KCXZhciBkaXZf b2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKCdBdXRvU3VnZ2VzdCcpOw0K CWlmCSghcF9ldmVudCkNCgkJcF9ldmVudCA9IHdpbmRvdy5ldmVudDsNCi8vCXZh ciBjb2RlID0gcF9ldmVudC5jaGFyQ29kZSB8fCBwX2V2ZW50LmtleUNvZGU7DQoJ dmFyIGNvZGUgPSBwX2V2ZW50LmtleUNvZGU7DQoJaWYJKGNvZGUgIT0gNDApDQoJ ew0KCQkvLwlIaWRlIEF1dG9TdWdnZXN0IGRpdiBpZiBpdCdzIG9wZW4NCgkJaWYJ KChkaXZfb2JqICE9IG51bGwpJiYoZGl2X29iai5zdHlsZS5kaXNwbGF5ICE9ICdu b25lJykpDQoJCQlkaXZfb2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCUFT X2Nob2ljZSA9IC0xOw0KCQlyZXR1cm47DQoJfQ0KDQoJLy8JSXQncyBhIGtleSBk b3duIGV2ZW50LiBJZiB0aGUgQXV0b1N1Z2dlc3QgZGl2IGlzIGRpc3BsYXllZA0K CWlmCSgoZGl2X29iaiAhPSBudWxsKSYmKGRpdl9vYmouc3R5bGUuZGlzcGxheSAh PSAnbm9uZScpKQ0KCXsNCgkJQVNfU2VsZWN0RGl2ICgwKTsNCgl9DQoJZWxzZQ0K CXsNCgkJLy8JRG9uJ3Qgc2VuZCByZXF1ZXN0IGZvciB0aGUgc2FtZSBzdHJpbmcg bW9yZSB0aGFuIG9uY2UNCgkJV2F0Y2hpbmdfUmVzZXRUaW1lciAoKTsNCgkJLy8J Q2FsbCBhdXRvc3VnZ2VzdCBzY3JpcHQNCgkJQVNfU2VuZFJlcXVlc3QgKEFTX2lu X29iamVjdC5pZCwgQVNfaW5fb2JqZWN0LnZhbHVlLCAxKTsNCgl9DQoNCglyZXR1 cm47DQp9DQoNCmZ1bmN0aW9uCUFTX0FLZXkgKHBfZXZlbnQsIHBfbikNCnsNCgl2 YXIgZGl2X29iaiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICgnQXV0b1N1Z2dl c3QnKTsNCglpZgkoZGl2X29iaiA9PSBudWxsKQlyZXR1cm47DQoJaWYJKCFwX2V2 ZW50KQlwX2V2ZW50ID0gd2luZG93LmV2ZW50Ow0KLy8JdmFyIGNvZGUgPSBwX2V2 ZW50LmNoYXJDb2RlIHx8IHBfZXZlbnQua2V5Q29kZTsNCgl2YXIgY29kZSA9IHBf ZXZlbnQua2V5Q29kZTsNCgkvLwlFc2NhcGUNCglpZgkoY29kZSA9PSAyNykNCgl7 DQoJCUFTX2luX29iamVjdC5mb2N1cygpOw0KCQkvLwlIaWRlIEF1dG9TdWdnZXN0 IGRpdiBpZiBpdCdzIG9wZW4NCgkJaWYJKGRpdl9vYmouc3R5bGUuZGlzcGxheSAh PSAnbm9uZScpDQoJCQlkaXZfb2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJ CUFTX2Nob2ljZSA9IC0xOw0KCQlyZXR1cm47DQoJfQ0KCS8vCVVwDQoJaWYJKGNv ZGUgPT0gMzgpDQoJew0KCQkvLwlHbyBiYWNrIHRvIHRoZSB0ZXh0IGZpZWxkPw0K CQlpZgkocF9uID09IDApDQoJCXsNCgkJCUFTX2luX29iamVjdC5mb2N1cygpOw0K CQkJLy8gSGlkZSB0aGUgZGl2IG9iamVjdA0KCQkJaWYJKGRpdl9vYmouc3R5bGUu ZGlzcGxheSAhPSAnbm9uZScpDQoJCQkJZGl2X29iai5zdHlsZS5kaXNwbGF5ID0g J25vbmUnOw0KCQkJQVNfY2hvaWNlID0gLTE7DQoJCX0NCgkJZWxzZQ0KCQkJQVNf U2VsZWN0RGl2IChwX24gLSAxKTsNCgkJcmV0dXJuOw0KCX0NCgkvLwlEb3duDQoJ aWYJKGNvZGUgPT0gNDApDQoJew0KCQlBU19TZWxlY3REaXYgKHBfbiArIDEpOw0K CQlyZXR1cm47DQoJfQ0KCS8vCVJpZ2h0DQoJaWYJKChjb2RlID09IDM5KXx8KGNv ZGUgPT0gMTMpKQ0KCXsNCgkJdmFyIGRpdnMgPSBkaXZfb2JqLmdldEVsZW1lbnRz QnlUYWdOYW1lKCdESVYnKTsNCgkJaWYJKGRpdnMgPT0gbnVsbCkJCQkJcmV0dXJu Ow0KCQlpZgkoZGl2cy5sZW5ndGggPT0gMCkJCQlyZXR1cm47DQoJCWlmCShBU19j aG9pY2UgPj0gZGl2cy5sZW5ndGgpCXJldHVybjsNCgkJaWYJKChBU19jaG9pY2Ug Pj0gMCkmJihkaXZzW3Bfbl0ub25jbGljaykpDQoJCQlkaXZzW3Bfbl0ub25jbGlj ayAoKTsNCgkJcmV0dXJuOw0KCX0NCn0NCg0KZnVuY3Rpb24JQVNfU2VsZWN0RGl2 IChwX24pDQp7DQoJaWYJKHBfbiA8IDApCXJldHVybjsNCgl2YXIgZGl2X29iaiA9 IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkICgnQXV0b1N1Z2dlc3QnKTsNCglpZgko ZGl2X29iaiA9PSBudWxsKQlyZXR1cm47DQoJdmFyIGRpdnMgPSBkaXZfb2JqLmdl dEVsZW1lbnRzQnlUYWdOYW1lKCdESVYnKTsNCglpZgkoZGl2cyA9PSBudWxsKQkJ CXJldHVybjsNCglpZgkoZGl2cy5sZW5ndGggPT0gMCkJCXJldHVybjsNCglpZgko cF9uID49IGRpdnMubGVuZ3RoKQlyZXR1cm47DQoJQVNfTU92ZXIoZGl2c1twX25d LCAyLCBwX24pOw0KfQ0KDQpmdW5jdGlvbglBU19Eb2NNb3VzZSAocF9ldmVudCkN CnsNCgl2YXIgZSA9IHBfZXZlbnQgfHwgd2luZG93LmV2ZW50Ow0KCS8vCUlmIHRo ZXJlIHdhcyBhbiBhY3RpdmUgb25tb3VzZWRvd24gaGFuZGxlciAtIGludm9rZSBp dA0KCWlmCShBU19vbm1vdXNlZG93biAhPSBudWxsKQ0KCQlBU19vbm1vdXNlZG93 biAocF9ldmVudCk7DQoNCgkvLwlEZXRlcm1pbmUgd2hlcmUgdGhlIG1vdXNlIHdh cyBjbGlja2VkDQoJdmFyIGNvb3JkcyA9IG5ldyBPYmplY3QoKTsNCglDV19Nb3Vz ZVhZIChlLCBjb29yZHMpOw0KCXZhciB4ID0gY29vcmRzLng7DQoJdmFyIHkgPSBj b29yZHMueTsNCg0KCXZhciBkaXZfb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQgKCdBdXRvU3VnZ2VzdCcpOw0KCWlmCShkaXZfb2JqID09IG51bGwpCXJldHVy bjsNCglpZgkoZGl2X29iai5zdHlsZS5kaXNwbGF5ID09ICdub25lJykJcmV0dXJu Ow0KCXZhciBwYXJlbnQgPSBkaXZfb2JqOw0KLy8JdmFyIHBhcmVudCA9IGRpdl9v Ymoub2Zmc2V0UGFyZW50Ow0KCXdoaWxlICgocGFyZW50ICE9IG51bGwpJiYocGFy ZW50Lm5vZGVOYW1lICE9ICdCT0RZJykpDQoJew0KCQl4IC09IHBhcmVudC5vZmZz ZXRMZWZ0Ow0KCQl5IC09IHBhcmVudC5vZmZzZXRUb3A7DQoJCXBhcmVudCA9IHBh cmVudC5vZmZzZXRQYXJlbnQ7DQoJfQ0KLy9hbGVydCh4ICsgJyAnICsgZGl2X29i ai5vZmZzZXRMZWZ0ICsgJyAnICsgZGl2X29iai5vZmZzZXRXaWR0aCArICcgJyAr DQovLyB5ICsgJyAnICsgZGl2X29iai5vZmZzZXRUb3AgKyAnICcgKyBkaXZfb2Jq Lm9mZnNldEhlaWdodCk7DQoNCgkvLwlJZiB0aGUgbW91c2Ugd2FzIGNsaWNrZWQg b3V0c2lkZSBvZiB0aGUgQXV0b1N1Z2dlc3QgZGl2DQoJLy8JdGhlbiBoaWRlIHRo ZSBBdXRvU3VnZ2VzdCBkaXYNCglpZgkoKHggPCAwKXx8KHggPiBkaXZfb2JqLm9m ZnNldFdpZHRoKXx8DQoJCSAoeSA8IDApfHwoeSA+IGRpdl9vYmoub2Zmc2V0SGVp Z2h0KSkNCgkJCWRpdl9vYmouc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCn0NCg0K ZnVuY3Rpb24JQVNfQmx1ciAocF9vYmplY3QpDQp7DQoNCglBU19hY3RpdmUgPSAw Ow0KCXBfb2JqZWN0Lm9ua2V5ZG93biA9IEFTX29ua2V5ZG93bjsNCglkb2N1bWVu dC5vbm1vdXNlZG93biA9IEFTX29ubW91c2Vkb3duOw0KCVdhdGNoaW5nX1N0b3Ao bnVsbCwgcF9vYmplY3QpOw0KCWlmCShBU19jb2xvcl9zZXQpDQoJew0KCQlBU19p bl9vYmplY3Quc3R5bGUuY29sb3IgPSBBU19jb2xvcjsNCgkJQVNfY29sb3Jfc2V0 ID0gMDsNCgl9DQoJQVNfaW5fb2JqZWN0LmF1dG9jb21wbGV0ZSA9IEFTX2F1dG9j b21wbGV0ZTsNCg0KCXZhciBkaXZfb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5 SWQgKCdBdXRvU3VnZ2VzdCcpOw0KCWlmCSgoZGl2X29iaiAhPSBudWxsKSYmKGRp dl9vYmouc3R5bGUuZGlzcGxheSAhPSAnbm9uZScpKQ0KCXsNCgkJLy8JU2VlIGlm IHRoZSB1c2VyIGNsaWNrZWQgd2l0aGluIEF1dG9TdWdnZXN0IERJViB0YWcNCi8v CQlpZgkoIUNXX0NoZWNrT2JqZWN0RXZlbnQgKGRpdl9vYmopKQ0KLy8JCQlkaXZf b2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJfQ0KfQ0KDQpmdW5jdGlvbglB U19Db3B5VmFsdWUgKHBfdmFsdWUpDQp7DQoNCglpZgkocF92YWx1ZSAhPSBudWxs KQ0KCXsNCgkJQVNfY2hvaWNlID0gLTE7DQoJCXBfdmFsdWUgPSB1bmVzY2FwZShw X3ZhbHVlKTsNCgkJLy8gT2xkIGJlaGF2aW9yIC0ganVzdCBzZXQgdmFsdWUNCgkJ aWYJKChBU19zZXRfdmFsdWUgPT0gbnVsbCl8fChBU19zZXRfdmFsdWUgPT0gJ1NF VCcpKQ0KCQl7DQoJCQkvLwlHZXQgVE8gb2JqZWN0DQoJCQl2YXIgdG9fb2JqID0g ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKEFTX2luX2ZpZWxkKTsNCgkJCWlmCSh0 b19vYmogPT0gbnVsbCkNCgkJCQlhbGVydCAoIk9iamVjdCB3aXRoIGlkICciICsg QVNfaW5fZmllbGQgKyAiJyBub3QgZm91bmQhIik7DQoJCQllbHNlDQoJCQl7DQoJ CQkJdG9fb2JqLnZhbHVlID0gcF92YWx1ZTsNCgkJCQl0b19vYmouZm9jdXMoKTsN CgkJCX0NCgkJfQ0KCQllbHNlIGlmIChBU19zZXRfdmFsdWUgPT0gJ1VSTCcpDQoJ CXsNCgkJCWlmCShwX3ZhbHVlICE9ICcnKQ0KCQkJCXdpbmRvdy5sb2NhdGlvbi5o cmVmID0gcF92YWx1ZTsNCgkJfQ0KCQllbHNlIGlmIChBU19zZXRfdmFsdWUuc2Vh cmNoKC9eVVJMOlxzKiguKykkLykgIT0gLTEpDQoJCXsNCgkJCXZhciB1cmwgPSBS ZWdFeHAuJDE7DQoJCQlwX3ZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHBfdmFs dWUpOw0KCQkJdXJsID0gdXJsLnJlcGxhY2UoL1wlXCUvLCBwX3ZhbHVlKTsNCgkJ CXVybCA9IHVybC5yZXBsYWNlKC9cJShcdyspXCUvZywgUmVwbGFjZUFjdGlvblN0 cmluZyk7DQoJCQl3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybDsNCgkJfQ0KCQll bHNlIGlmIChBU19zZXRfdmFsdWUuc2VhcmNoKC9eV0lORE9XOlxzKiguKykkLykg IT0gLTEpDQoJCXsNCgkJCXZhciB1cmwgPSBSZWdFeHAuJDE7DQoJCQlwX3ZhbHVl ID0gZW5jb2RlVVJJQ29tcG9uZW50KHBfdmFsdWUpOw0KCQkJdXJsID0gdXJsLnJl cGxhY2UoL1wlXCUvLCBwX3ZhbHVlKTsNCgkJCXVybCA9IHVybC5yZXBsYWNlKC9c JShcdyspXCUvZywgUmVwbGFjZUFjdGlvblN0cmluZyk7DQoJCQl2YXIgYXNfd2lu ID0gb3BlbiAodXJsLCAnQVNfV2luZG93JywNCgkJCQkncmVzaXphYmxlPXllcyxz Y3JvbGxiYXJzPXllcycpOw0KCQkJaWYgKGFzX3dpbi5vcGVuZXIgPT0gbnVsbCkg YXNfd2luLm9wZW5lciA9IHNlbGY7DQoJCX0NCgl9DQoNCgkvLwlIaWRlIHRoZSBB dXRvc3VnZ2VzdCBESVYgb2JqZWN0DQoJdmFyIGRpdl9vYmogPSBkb2N1bWVudC5n ZXRFbGVtZW50QnlJZCAoJ0F1dG9TdWdnZXN0Jyk7DQoJaWYJKChkaXZfb2JqICE9 IG51bGwpJiYoZGl2X29iai5zdHlsZS5kaXNwbGF5ICE9ICdub25lJykpDQoJCWRp dl9vYmouc3R5bGUuZGlzcGxheSA9ICdub25lJzsNCg0KCXJldHVybiBmYWxzZTsN Cn0NCg0KZnVuY3Rpb24JR290byhwX3VybCkNCnsNCgl3aW5kb3cubG9jYXRpb24u aHJlZiA9IHBfdXJsLnJlcGxhY2UoL1wlKFx3KylcJS9nLCBHb3RvX19SZXBsYWNl KTsNCn0NCg0KZnVuY3Rpb24JR290b1cocF91cmwpDQp7DQoJdmFyIHVybCA9IHBf dXJsLnJlcGxhY2UoL1wlKFx3KylcJS9nLCBSZXBsYWNlQWN0aW9uU3RyaW5nKTsN Cgl2YXIgdyA9IG9wZW4gKHVybCwgJ0dPVE9fV2luZG93JywgJ3Jlc2l6YWJsZT15 ZXMsc2Nyb2xsYmFycz15ZXMnKTsNCglpZiAody5vcGVuZXIgPT0gbnVsbCkgdy5v cGVuZXIgPSBzZWxmOw0KfQ0KDQpmdW5jdGlvbglHb3RvX19SZXBsYWNlIChwX21h dGNoLCBwXzEpDQp7DQoJcmV0dXJuIEdldE9iamVjdFZhbHVlIChwXzEpOw0KfQ0K DQpmdW5jdGlvbglHZXRPYmplY3RWYWx1ZSAocF9maWVsZCkNCnsNCg0KCXZhciBv YmogPSBwX2ZpZWxkOw0KCWlmCShvYmogPT0gbnVsbCkJcmV0dXJuIG51bGw7DQoJ aWYJKHR5cGVvZiAob2JqKSA9PSAnc3RyaW5nJykNCgl7DQoJCWlmCShvYmogPT0g JycpCXJldHVybiBudWxsOw0KCQkNCgkJb2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQgKG9iaik7DQoJCWlmCShvYmogPT0gbnVsbCkNCgkJew0KCQkJYWxlcnQg KCdJbnRlcm5hbCBlcnJvcjogQ2Fubm90IGZpbmQgb2JqZWN0IHdpdGggaWQgIicg KyBwX2ZpZWxkICsgJyIhJyk7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCgl9DQoNCgl2 YXIJdHlwZSA9IG9iai50eXBlOw0KCWlmCSh0eXBlID09IG51bGwpCXR5cGUgPSBv YmpbMF0udHlwZTsNCg0KCXZhciBpLCBsZW47DQoJdmFyIHMgPSAnJzsNCglpZgko KHR5cGUgPT0gJ2NoZWNrYm94Jyl8fCh0eXBlID09ICdyYWRpbycpKQ0KCXsNCgkJ aWYJKG9iai5sZW5ndGgpDQoJCXsNCgkJCWxlbiA9IG9iai5sZW5ndGg7DQoJCQlm b3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspDQoJCQl7DQoJCQkJaWYJKG9ialtpXS5j aGVja2VkKQ0KCQkJCXsNCgkJCQkJaWYJKHMgIT0gJycpDQoJCQkJCQlzICs9ICIs IjsNCgkJCQkJcyArPSBvYmpbaV0udmFsdWU7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJ CWVsc2UNCgkJCXMgPSAob2JqLmNoZWNrZWQpPyBvYmoudmFsdWU6ICcnOw0KCX0N CgllbHNlIGlmICgodHlwZSA9PSAnc2VsZWN0LW9uZScpfHwodHlwZSA9PSAnc2Vs ZWN0LW11bHRpcGxlJykpDQoJew0KCQlsZW4gPSBvYmoubGVuZ3RoOw0KCQlmb3Ig KGkgPSAwOyBpIDwgbGVuOyBpKyspDQoJCXsNCgkJCWlmCShvYmoub3B0aW9uc1tp XS5zZWxlY3RlZCkNCgkJCXsNCgkJCQlpZgkocyAhPSAnJykNCgkJCQkJcyArPSAi LCI7DQoJCQkJcyArPSBvYmoub3B0aW9uc1tpXS52YWx1ZTsNCgkJCX0NCgkJfQ0K CX0NCgllbHNlDQoJew0KCQlzID0gb2JqLnZhbHVlOw0KCX0NCg0KCXJldHVybiBz Ow0KfQ0KDQp2YXIgUERNX29iamVjdF9pZDsNCnZhciBQRE1fYWN0aW9uOw0KdmFy IFBETV9jaG9pY2U7DQp2YXIgUERNX2RlbGF5Ow0KdmFyIFBETV9zZXRfdmFsdWU7 DQp2YXIgUERNX29ubW91c2Vkb3duOw0KdmFyCVBETV9kYXRhX2NhY2hlID0gbmV3 IE9iamVjdCgpOw0KdmFyIFBETV9sYXN0X3JlcTsNCnZhciBQRE1fcGFyZW50X2Ns YXNzOw0KDQpmdW5jdGlvbglQRE1fRm9jdXMgKHBfb2JqZWN0LCBwX2FjdGlvbiwg cF9kZWxheSwgcF9zZXQpDQp7DQoNCglpZgkoIXBfb2JqZWN0LmlkKQ0KCXsNCgkJ YWxlcnQoIkZpZWxkIGRvZXNuJ3QgaGF2ZSBhbiBpZC5cbk1lbnUgd2lsbCBub3Qg d29yayBmb3IgdGhpcyBmaWVsZCIpOw0KCQlyZXR1cm47DQoJfQ0KDQoJdmFyIGlk ID0gcF9vYmplY3QuaWQ7DQoJaWYJKFBETV9vYmplY3RfaWQpDQoJew0KCQlpZgko UERNX29iamVjdF9pZCA9PSBpZCkJcmV0dXJuOw0KCQlQRE1fQmx1ciAoKTsNCgl9 DQoNCgkvLwlTYXZlIGFsbCBkYXRhDQoJUERNX29iamVjdF9pZCA9IHBfb2JqZWN0 LmlkOw0KCVBETV9hY3Rpb24gPSBwX2FjdGlvbjsNCglQRE1fZGVsYXkgPSBwX2Rl bGF5Ow0KCVBETV9jaG9pY2UgPSAtMTsNCglQRE1fc2V0X3ZhbHVlID0gcF9zZXQ7 DQoJUERNX2xhc3RfcmVxID0gMDsNCglQRE1fb25tb3VzZWRvd24gPSBkb2N1bWVu dC5vbm1vdXNlZG93bjsNCglQRE1fcGFyZW50X2NsYXNzID0gcF9vYmplY3QuY2xh c3NOYW1lOw0KCWRvY3VtZW50Lm9ubW91c2Vkb3duID0gUERNX0RvY01vdXNlOw0K DQoJaWYJKFBETV9kYXRhX2NhY2hlW2lkXSkNCgkJUERNX1Byb2Nlc3MoMCwgMCwg UERNX2RhdGFfY2FjaGVbaWRdKTsNCgllbHNlDQoJCVBETV9sYXN0X3JlcSA9IElu dm9rZUFjdGlvbiAocF9hY3Rpb24sIFBETV9Qcm9jZXNzKTsNCn0NCg0KZnVuY3Rp b24JUERNX1Byb2Nlc3MgKHBfcmVxX2lkLCBwX2VyciwgcF9kYXRhKQ0Kew0KDQoJ Ly8JRG9uJ3QgZG8gYW55dGhpbmcgaWYgTWVudSBpcyBub3QgYWN0aXZlDQoJaWYJ KCFQRE1fb2JqZWN0X2lkKQkJcmV0dXJuOw0KCS8vCURvbid0IHByb2Nlc3Mgb2xk IHJlcXVlc3RzDQoJaWYJKHBfcmVxX2lkICE9IFBETV9sYXN0X3JlcSkJcmV0dXJu Ow0KCVBETV9sYXN0X3JlcSA9IDA7DQoNCgl2YXIgZGl2X29iaiA9IGRvY3VtZW50 LmdldEVsZW1lbnRCeUlkICgnUERNZW51Jyk7DQoNCgkvLwlQcmludCBlcnJvciBp ZiBuZWNlc3NhcnkNCglpZgkocF9lcnIpDQoJew0KCQlpZgkoZGl2X29iaiAhPSBu dWxsKQ0KCQkJZGl2X29iai5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOw0KCQlhbGVy dChwX2RhdGEpOw0KCQlyZXR1cm47DQoJfQ0KDQoJaWYJKCFQRE1fZGF0YV9jYWNo ZVtQRE1fb2JqZWN0X2lkXSkNCgkJUERNX2RhdGFfY2FjaGVbUERNX29iamVjdF9p ZF0gPSBwX2RhdGE7DQoNCgl2YXIgcGFyZW50X29iaiA9IGRvY3VtZW50LmdldEVs ZW1lbnRCeUlkIChQRE1fb2JqZWN0X2lkKTsNCglpZgkocGFyZW50X29iaiA9PSBu dWxsKQ0KCXsNCgkJYWxlcnQgKCJDYW5ub3QgZmluZCBvYmplY3Qgd2l0aCBpZCAn IiArIFBETV9vYmplY3RfaWQgKyAiJyEiKTsNCgkJcmV0dXJuOw0KCX0NCglwYXJl bnRfb2JqLmNsYXNzTmFtZSA9IChwYXJlbnRfb2JqLmNsYXNzTmFtZSk/DQoJCXBh cmVudF9vYmouY2xhc3NOYW1lICsgJyBQRE1lbnVQYXJlbnQnOiAnUERNZW51UGFy ZW50JzsNCg0KCS8vCUNyZWF0ZSBkaXYgd2l0aCBzZWxlY3QgYm94IGlmIG5lY2Vz c2FyeQ0KCWlmCShkaXZfb2JqID09IG51bGwpDQoJew0KCQlkaXZfb2JqID0gZG9j dW1lbnQuY3JlYXRlRWxlbWVudCAoJ2RpdicpOw0KCQlkaXZfb2JqLmlkID0gJ1BE TWVudSc7DQoJCWRpdl9vYmouY2xhc3NOYW1lID0gJ1BETWVudSc7DQoJCWRpdl9v YmouekluZGV4ID0gMTA7DQoJCWRpdl9vYmouc3R5bGUucG9zaXRpb24gPSAnYWJz b2x1dGUnOw0KCQlkaXZfb2JqLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7DQoJCWRp dl9vYmouc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nOw0KCQlkaXZfb2JqLnN0eWxlLm92 ZXJmbG93ID0gJ2F1dG8nOw0KCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRp dl9vYmopOw0KCX0NCi8vCWRpdl9vYmouc3R5bGUud2lkdGggPSBwYXJlbnRfb2Jq Lm9mZnNldFdpZHRoICsgJ3B4JzsNCglkaXZfb2JqLnN0eWxlLndpZHRoID0gJ2F1 dG8nOw0KCWRpdl9vYmouc3R5bGUubWluV2lkdGggPSBwYXJlbnRfb2JqLm9mZnNl dFdpZHRoICsgJ3B4JzsNCg0KCS8vCVVwZGF0ZSBjb250ZW50IG9mIHRoZSBQRE1l bnUgRElWIG9iamVjdA0KCXZhciBsZW4gPSBwX2RhdGEubGVuZ3RoOw0KCXZhciBo dG1sID0gbmV3IEFycmF5ICgpOw0KCXZhciBpLCBqLCBzLCB2Ow0KCWZvciAoaSA9 IDAsIGogPSAwOyBpIDwgbGVuOyBpKyspDQoJew0KCQlpZgkocF9kYXRhW2ldID09 ICcnKQljb250aW51ZTsNCgkJcyA9IHBfZGF0YVtpXTsNCgkJaWYJKHMgPT0gJy0t LX5+ficpDQoJCXsNCgkJCXMgPSAiPGhyIGNsYXNzPSdQRE1lbnVTZXBhcmF0b3In PiI7DQoJCQl2ID0gJyc7DQoJCX0NCgkJZWxzZSBpZgkocy5zZWFyY2goL14oLiop fn5+KC4qKSQvKSAhPSAtMSkNCgkJew0KCQkJcyA9IFJlZ0V4cC4kMTsNCgkJCXYg PSBSZWdFeHAuJDI7DQoJCX0NCgkJZWxzZQ0KCQkJdiA9IHM7DQoJCWh0bWwucHVz aCgiPGRpdiBjbGFzcz0nUERNZW51Q2hvaWNlIiArDQoJCQkiJyBvbk1vdXNlT3Zl cj0nUERNX01PdmVyKHRoaXMsMSwiICsgaiArDQoJCQkiKScgb25Gb2N1cz0nUERN X01PdmVyKHRoaXMsMSwiICsgaiArDQoJCQkiKScgb25Nb3VzZU91dD0nUERNX01P dmVyKHRoaXMsMCwiICsgaiArDQoJCQkiKScgb25CbHVyPSdQRE1fTU92ZXIodGhp cywwLCIgKyBqICsNCgkJCSIpJyBvbkNsaWNrPSdQRE1fQmx1cigpOyByZXR1cm4g UGFyc2VWYWx1ZShcIiIgKyBlc2NhcGUodikgKyAiXCIpJz4iICsgcyArICI8L2Rp dj4iKTsNCgkJaisrOw0KCX0NCglpZgkoaHRtbC5sZW5ndGggPT0gMCkNCgkJZGl2 X29iai5pbm5lckhUTUwgPSAiPHNwYW4gc3R5bGU9J2NvbG9yOiAjQzAwMDAwJz4m bHQ7Tm8gZGF0YSBmb3VuZCZndDs8L3NwYW4+IjsNCgllbHNlDQoJCWRpdl9vYmou aW5uZXJIVE1MID0gaHRtbC5qb2luKCJcbiIpOw0KCS8vCURldGVybWluZSB0ZXh0 IGZpZWxkJ3MgcG9zaXRpb24NCgl2YXIgeCA9IHBhcmVudF9vYmoub2Zmc2V0TGVm dDsNCgl2YXIgeSA9IHBhcmVudF9vYmoub2Zmc2V0VG9wICsgcGFyZW50X29iai5v ZmZzZXRIZWlnaHQ7DQoJdmFyIHBhcmVudCA9IHBhcmVudF9vYmoub2Zmc2V0UGFy ZW50Ow0KCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkNCgl7DQoJCXggKz0gcGFyZW50 Lm9mZnNldExlZnQ7DQoJCXkgKz0gcGFyZW50Lm9mZnNldFRvcDsNCgkJcGFyZW50 ID0gcGFyZW50Lm9mZnNldFBhcmVudDsNCgl9DQoJZGl2X29iai5zdHlsZS5oZWln aHQgPSBudWxsOw0KCS8vCU1ha2UgZGl2IHZpc2libGUNCglkaXZfb2JqLnN0eWxl LmRpc3BsYXkgPSAnYmxvY2snOw0KCUNXX0RpdlBvc2l0aW9uIChudWxsLCAnUERN ZW51JywgeCwgeSArIDMsIDIpOw0KfQ0KDQpmdW5jdGlvbglQRE1fRG9jTW91c2Ug KHBfZXZlbnQpDQp7DQoJaWYJKCFQRE1fb2JqZWN0X2lkKQlyZXR1cm47DQoNCgl2 YXIgZSA9IHBfZXZlbnQgfHwgd2luZG93LmV2ZW50Ow0KCS8vCUlmIHRoZXJlIHdh cyBhbiBhY3RpdmUgb25tb3VzZWRvd24gaGFuZGxlciAtIGludm9rZSBpdA0KCWlm CShQRE1fb25tb3VzZWRvd24gIT0gbnVsbCkNCgkJUERNX29ubW91c2Vkb3duIChw X2V2ZW50KTsNCg0KCS8vCURldGVybWluZSB3aGVyZSB0aGUgbW91c2Ugd2FzIGNs aWNrZWQNCgl2YXIgY29vcmRzID0gbmV3IE9iamVjdCgpOw0KCUNXX01vdXNlWFkg KGUsIGNvb3Jkcyk7DQoJdmFyIHggPSBjb29yZHMueDsNCgl2YXIgeSA9IGNvb3Jk cy55Ow0KDQoJdmFyIGRpdl9vYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAo J1BETWVudScpOw0KCWlmCShkaXZfb2JqID09IG51bGwpCXJldHVybjsNCglpZgko ZGl2X29iai5zdHlsZS5kaXNwbGF5ID09ICdub25lJykJcmV0dXJuOw0KCXZhciBw YXJlbnQgPSBkaXZfb2JqOw0KLy8JdmFyIHBhcmVudCA9IGRpdl9vYmoub2Zmc2V0 UGFyZW50Ow0KCXdoaWxlICgocGFyZW50ICE9IG51bGwpJiYocGFyZW50Lm5vZGVO YW1lICE9ICdCT0RZJykpDQoJew0KCQl4IC09IHBhcmVudC5vZmZzZXRMZWZ0Ow0K CQl5IC09IHBhcmVudC5vZmZzZXRUb3A7DQoJCXBhcmVudCA9IHBhcmVudC5vZmZz ZXRQYXJlbnQ7DQoJfQ0KLy9hbGVydCh4ICsgJyAnICsgZGl2X29iai5vZmZzZXRM ZWZ0ICsgJyAnICsgZGl2X29iai5vZmZzZXRXaWR0aCArICcgJyArDQovLyB5ICsg JyAnICsgZGl2X29iai5vZmZzZXRUb3AgKyAnICcgKyBkaXZfb2JqLm9mZnNldEhl aWdodCk7DQoNCgkvLwlJZiB0aGUgbW91c2Ugd2FzIGNsaWNrZWQgb3V0c2lkZSBv ZiB0aGUgQXV0b1N1Z2dlc3QgZGl2DQoJLy8JdGhlbiBoaWRlIHRoZSBBdXRvU3Vn Z2VzdCBkaXYNCglpZgkoKHggPCAwKXx8KHggPiBkaXZfb2JqLm9mZnNldFdpZHRo KXx8DQoJCSAoeSA8IDApfHwoeSA+IGRpdl9vYmoub2Zmc2V0SGVpZ2h0KSkNCgkJ CVBETV9CbHVyICgpOw0KfQ0KDQpmdW5jdGlvbiBQRE1fTU92ZXIocF9vYmosIHBf Zm9jdXMsIHBfbikNCnsNCg0KCXZhciBjbGFzc19uYW1lOw0KCWlmCSgoUERNX2No b2ljZSA+PSAwKSYmKHBfbiAhPSBQRE1fY2hvaWNlKSkNCgl7DQoJCXZhciBkaXZf b2JqID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgKCdQRE1lbnUnKTsNCgkJaWYJ KGRpdl9vYmogIT0gbnVsbCkNCgkJew0KCQkJdmFyIGRpdnMgPSBkaXZfb2JqLmdl dEVsZW1lbnRzQnlUYWdOYW1lKCdESVYnKTsNCgkJCWlmCSgoZGl2cyAhPSBudWxs KSYmKFBETV9jaG9pY2UgPCBkaXZzLmxlbmd0aCkpDQoJCQl7DQoJCQkJY2xhc3Nf bmFtZSA9IGRpdnNbUERNX2Nob2ljZV0uY2xhc3NOYW1lOw0KCQkJCWRpdnNbUERN X2Nob2ljZV0uY2xhc3NOYW1lID0NCgkJCQkJY2xhc3NfbmFtZS5yZXBsYWNlKC9e UERNZW51U2VsZWN0ZWQvLCAiUERNZW51Q2hvaWNlIik7DQoJCQl9DQoJCQlQRE1f Y2hvaWNlID0gLTE7DQoJCX0NCgl9DQoNCgljbGFzc19uYW1lID0gcF9vYmouY2xh c3NOYW1lOw0KCWlmCShwX2ZvY3VzKQ0KCXsNCgkJcF9vYmouY2xhc3NOYW1lID0g Y2xhc3NfbmFtZS5yZXBsYWNlKC9eUERNZW51Q2hvaWNlLywgIlBETWVudVNlbGVj dGVkIik7DQoJCWlmCShwX2ZvY3VzID09IDIpDQoJCQlTY3JvbGxJbnRvVmlldyAo cF9vYmopOw0KCQlQRE1fY2hvaWNlID0gcF9uOw0KCX0NCgllbHNlDQoJew0KCQlw X29iai5jbGFzc05hbWUgPSBjbGFzc19uYW1lLnJlcGxhY2UoL15QRE1lbnVTZWxl Y3RlZC8sICJQRE1lbnVDaG9pY2UiKTsNCgkJUERNX2Nob2ljZSA9IC0xOw0KCX0N Cn0NCg0KZnVuY3Rpb24JUERNX0JsdXIgKCkNCnsNCg0KCWlmCSghUERNX29iamVj dF9pZCkJcmV0dXJuOw0KDQoJdmFyIHBhcmVudF9vYmogPSBkb2N1bWVudC5nZXRF bGVtZW50QnlJZCAoUERNX29iamVjdF9pZCk7DQoJUERNX29iamVjdF9pZCA9IDA7 DQoJZG9jdW1lbnQub25tb3VzZWRvd24gPSBQRE1fb25tb3VzZWRvd247DQoJdmFy IGRpdl9vYmogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCAoJ1BETWVudScpOw0K CWlmCSgoZGl2X29iaiAhPSBudWxsKSYmKGRpdl9vYmouc3R5bGUuZGlzcGxheSAh PSAnbm9uZScpKQ0KCXsNCgkJLy8JU2VlIGlmIHRoZSB1c2VyIGNsaWNrZWQgd2l0 aGluIEF1dG9TdWdnZXN0IERJViB0YWcNCi8vCQlpZgkoIUNXX0NoZWNrT2JqZWN0 RXZlbnQgKGRpdl9vYmopKQ0KCQkJZGl2X29iai5zdHlsZS5kaXNwbGF5ID0gJ25v bmUnOw0KCX0NCg0KCWlmCShwYXJlbnRfb2JqICE9IG51bGwpDQoJCXBhcmVudF9v YmouY2xhc3NOYW1lID0gUERNX3BhcmVudF9jbGFzczsNCn0NCg0KdmFyIENXX2Ni X2lkID0gMDsNCnZhcglDV19jYl9jYWNoZSA9IG5ldyBPYmplY3QoKTsNCg0KZnVu Y3Rpb24JSW52b2tlQWN0aW9uIChwX2FjdGlvbiwgcF9mdW5jdGlvbikNCnsNCg0K CUNXX2NiX2lkKys7DQoNCglpZgkodHlwZW9mIHBfYWN0aW9uID09ICdmdW5jdGlv bicpDQoJew0KCQl2YXIgYXJyID0gcF9hY3Rpb24gKCk7DQoJCXBfZnVuY3Rpb24g KCh0eXBlb2YgYXJyID09ICdzdHJpbmcnKT8gMTogMCwgYXJyKTsNCgl9DQoJZWxz ZSBpZgkodHlwZW9mIHBfYWN0aW9uID09ICdzdHJpbmcnKQ0KCXsNCgkJdmFyIGEg PSBwX2FjdGlvbi5zcGxpdCgvXD8vKTsNCgkJdmFyIHVybCwgcGFyYW1zOw0KCQlp ZgkoYSA9PSBudWxsKQ0KCQl7DQoJCQl1cmwgPSBwX2FjdGlvbjsNCgkJCXBhcmFt cyA9ICcnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdXJsID0gYVswXTsNCgkJCXBh cmFtcyA9IGFbMV07DQoJCQlpZgkocGFyYW1zID09IG51bGwpCXBhcmFtcyA9ICcn Ow0KCQkJcGFyYW1zID0gcGFyYW1zLnJlcGxhY2UoL1wlKFthLXpBLVpdXHcqKVwl L2csIFJlcGxhY2VBY3Rpb25TdHJpbmcpOw0KCQl9DQoNCgkJaWYJKHBhcmFtcy5t YXRjaCgvXCVfRklFTEQlLykpDQoJCQlwYXJhbXMgPSBwYXJhbXMucmVwbGFjZSgv XCVfRklFTEQlL2csIENXX2NiX2lkKTsNCgkJZWxzZQ0KCQl7DQoJCQlpZgkocGFy YW1zICE9ICcnKQlwYXJhbXMgKz0gJyYnOw0KCQkJcGFyYW1zICs9ICdGSUVMRD0n ICsgQ1dfY2JfaWQ7DQoJCX0NCg0KCQlDV19jYl9jYWNoZVtDV19jYl9pZF0gPSBw X2Z1bmN0aW9uOw0KDQoJCW5ldyBBamF4LlJlcXVlc3QodXJsLA0KCQl7DQoJCQlt ZXRob2Q6ICdnZXQnLA0KCQkJcGFyYW1ldGVyczogcGFyYW1zLA0KCQkJb25TdWNj ZXNzOiBDYWxsYmFja0FjdGlvbg0KCQl9KTsNCgl9DQoJZWxzZSBpZiAodHlwZW9m IHBfYWN0aW9uID09ICdvYmplY3QnKQ0KCXsNCgkJdmFyIGEgPSBuZXcgQXJyYXkg KCk7DQoJCXZhciBsZW4gPSBwX2FjdGlvbi5sZW5ndGg7DQoJCXZhciBpOw0KCQlm b3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspDQoJCXsNCi8vCQkJaWYJKHBfYWN0aW9u W2ldLmluZGV4T2YocF92YWx1ZSkgIT0gLTEpDQoJCQkJYS5wdXNoIChwX2FjdGlv bltpXSk7DQoJCX0NCgkJcF9mdW5jdGlvbigwLCBhKTsNCgl9DQoNCglyZXR1cm4g Q1dfY2JfaWQ7DQp9DQoNCmZ1bmN0aW9uCVJlcGxhY2VBY3Rpb25TdHJpbmcgKHBf bWF0Y2gsIHBfMSkNCnsNCg0KCXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoR2V0 T2JqZWN0VmFsdWUgKHBfMSkpOw0KfQ0KDQpmdW5jdGlvbglDYWxsYmFja0FjdGlv biAocF90cmFuc3BvcnQpDQp7DQoNCgkvLwlDaGVjayBmb3IgZmF0YWwgZXJyb3IN Cgl0ZXh0ID0gcF90cmFuc3BvcnQucmVzcG9uc2VUZXh0Ow0KCWlmCSh0ZXh0Lm1h dGNoICgvXkVSUk9SOi8pKQ0KCXsNCgkJYWxlcnQgKHRleHQpOw0KCQlyZXR1cm47 DQoJfQ0KDQoJLy8JR2V0IHJlcXVlc3QgaWQNCgl2YXIgYSA9IHRleHQuc3BsaXQg KC9ccypcbi8pOw0KCXZhciBpZCA9IGEuc2hpZnQoKTsNCglpZCA9IGlkLnJlcGxh Y2UoL15JTkZPOlxzKi8sICcnKTsNCgkvLwlJZ25vcmUgcmVxdWVzdCBpZiB3ZSdy ZSBub3Qgd2FpdGluZyBmb3IgaXQNCglpZgkoIUNXX2NiX2NhY2hlW2lkXSkJcmV0 dXJuOw0KDQoJdmFyIGNhbGxfZnVuY3Rpb24gPSBDV19jYl9jYWNoZVtpZF07DQoJ Q1dfY2JfY2FjaGVbaWRdID0gbnVsbDsNCgl2YXIJZXJyID0gMDsNCglpZgkoYVsw XSAhPSBudWxsKQ0KCXsNCgkJaWYJKGFbMF0ubWF0Y2ggKC9eRVJST1I6LykpDQoJ CXsNCgkJCWNhbGxfZnVuY3Rpb24gKGlkLCAxLCBhLmpvaW4oIlxuIikpOw0KCQkJ cmV0dXJuOw0KCQl9DQoJCWFbMF0gPSBhWzBdLnJlcGxhY2UoL15JTkZPOlxzKi8s ICcnKTsNCgl9DQoNCgljYWxsX2Z1bmN0aW9uIChpZCwgMCwgYSk7DQp9DQoNCmZ1 bmN0aW9uCVBhcnNlVmFsdWUgKHBfdmFsdWUpDQp7DQoNCglpZgkocF92YWx1ZSA9 PSBudWxsKQlyZXR1cm4gZmFsc2U7DQoNCglwX3ZhbHVlID0gdW5lc2NhcGUocF92 YWx1ZSk7DQoJLy8gT2xkIGJlaGF2aW9yIC0ganVzdCBzZXQgdmFsdWUNCglpZiAo cF92YWx1ZS5zZWFyY2goL15TRVRccysoXHcrKVxzKyguKikkLykgIT0gLTEpDQoJ ew0KCQl2YXIgZmllbGQgPSBSZWdFeHAuJDE7DQoJCXZhciB2YWx1ZSA9IFJlZ0V4 cC4kMjsNCgkJLy8JR2V0IFRPIG9iamVjdA0KCQl2YXIgdG9fb2JqID0gZG9jdW1l bnQuZ2V0RWxlbWVudEJ5SWQgKGZpZWxkKTsNCgkJaWYJKHRvX29iaiA9PSBudWxs KQ0KCQkJYWxlcnQgKCJPYmplY3Qgd2l0aCBpZCAnIiArIEFTX2luX2ZpZWxkICsg Iicgbm90IGZvdW5kISIpOw0KCQllbHNlDQoJCQl0b19vYmoudmFsdWUgPSB2YWx1 ZTsNCgl9DQoJZWxzZSBpZiAocF92YWx1ZS5zZWFyY2goL15VUkw6XHMqKC4rKSQv KSAhPSAtMSkNCgl7DQoJCXZhciB1cmwgPSBSZWdFeHAuJDE7DQoJCXVybCA9IHVy bC5yZXBsYWNlKC9cJShcdyspXCUvZywgUmVwbGFjZUFjdGlvblN0cmluZyk7DQoJ CXdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdXJsOw0KCX0NCgllbHNlIGlmIChwX3Zh bHVlLnNlYXJjaCgvXldJTkRPVzpccyooLispJC8pICE9IC0xKQ0KCXsNCgkJdmFy IHVybCA9IFJlZ0V4cC4kMTsNCgkJdXJsID0gdXJsLnJlcGxhY2UoL1wlKFx3Kylc JS9nLCBSZXBsYWNlQWN0aW9uU3RyaW5nKTsNCgkJdmFyIGN3X3dpbiA9IG9wZW4g KHVybCwgJ0NXX1dpbmRvdycsDQoJCQkncmVzaXphYmxlPXllcyxzY3JvbGxiYXJz PXllcycpOw0KCQlpZiAoY3dfd2luLm9wZW5lciA9PSBudWxsKSBjd193aW4ub3Bl bmVyID0gc2VsZjsNCgl9DQoJZWxzZQ0KCXsNCgkJYWxlcnQgKCJJbnRlcm5hbCBl cnJvciBpbiBQYXJzZVZhbHVlOiBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdmFs dWUgJyIgKw0KCQkJcF92YWx1ZSArICInIik7DQoJfQ0KDQoJcmV0dXJuIGZhbHNl Ow0KfQ0KDQpmdW5jdGlvbiBDUmVwbHkgKHBfb2JqLCBwX29uKQ0Kew0KDQoJdmFy CWlkID0gcF9vYmouaWQ7DQoJaWYJKGlkID09IG51bGwpCXJldHVybjsNCgl2YXIg YSA9IGlkLnNwbGl0ICgnXycpOw0KDQoJdmFyIHJfaWQgPSAnQ19SXycgKyBhWzNd Ow0KCXZhciByX2RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkIChyX2lkKTsN CglpZgkocl9kaXYgPT0gbnVsbCkNCgl7DQoJCXJfZGl2ID0gZG9jdW1lbnQuY3Jl YXRlRWxlbWVudCgnRElWJyk7DQoJCXJfZGl2LnNldEF0dHJpYnV0ZSgnaWQnLCAn Q19SXycgKyBhWzNdKTsNCgkJcl9kaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJzsN CgkJcl9kaXYuY2xhc3NOYW1lID0gJ2NvbW1lbnRfaHJlcGx5JzsNCgkJcl9kaXYu aW5uZXJIVE1MID0gIjxpbnB1dCB0eXBlPSdidXR0b24nIG5hbWU9J1JFUExZJyB2 YWx1ZT0nUmVwbHknIGNsYXNzPSdjb21tZW50X3JidXR0b24nIG9uQ2xpY2s9J3dp bmRvdy5sb2NhdGlvbi5ocmVmID0gXCIvY2dpLWJpbi9BZGRDb21tZW50LnBsP1BB R0VfSUQ9IiArDQoJCQlhWzJdICsgIiZSRVBMWT0iICsgYVszXSArICImUFJPQ0VT Uz1Qb3N0XCInPiI7DQoJCXBfb2JqLmluc2VydEJlZm9yZShyX2RpdiwgcF9vYmou Zmlyc3RDaGlsZCk7DQoJfQ0KCXJfZGl2LnN0eWxlLmRpc3BsYXkgPSAocF9vbik/ ICdibG9jayc6ICdub25lJzsNCn0NCg== ------------LkJeSl8GS9sfggkpwGdDkc--